diff --git a/app/controllers/admin/diagnostics_controller.rb b/app/controllers/admin/diagnostics_controller.rb index d3ea9cc968a..ffe78e15c91 100644 --- a/app/controllers/admin/diagnostics_controller.rb +++ b/app/controllers/admin/diagnostics_controller.rb @@ -3,20 +3,7 @@ class Admin::DiagnosticsController < Admin::AdminController skip_before_filter :check_xhr def memory_stats - - begin - # ruby 2.1 - GC.start(full_mark: true) - rescue - GC.start - end - - stats = GC.stat.map{|k,v| "#{k}: #{v}"} - counts = ObjectSpace.count_objects.map{|k,v| "#{k}: #{v}"} - - render text: "GC STATS:\n#{stats.join("\n")} \n\nObjects:\n#{counts.join("\n")}", - content_type: Mime::TEXT - + render text: memory_report, content_type: Mime::TEXT end def dump_heap @@ -34,4 +21,51 @@ class Admin::DiagnosticsController < Admin::AdminController render text: "HEAP DUMP:\nnot supported", content_type: Mime::TEXT end end + + protected + + def memory_report + begin + # ruby 2.1 + GC.start(full_mark: true) + rescue + GC.start + end + + + classes = {} + + ObjectSpace.each_object do |o| + begin + next if o == classes + + classes[o.class] ||= 0 + classes[o.class] += 1 + rescue + # all sorts of stuff can happen here BasicObject etc. + classes[:unknown] ||= 0 + classes[:unknown] += 1 + end + end + + stats = GC.stat.map{|k,v| "#{k}: #{v}"} + counts = ObjectSpace.count_objects.sort{|a,b| b[1] <=> a[1] }.map{|k,v| "#{k}: #{v}"} + + classes = classes.sort{|a,b| b[1] <=> a[1]}[0..40].map{|klass, count| "#{klass}: #{count}"} + + + <