diff --git a/app/controllers/admin/diagnostics_controller.rb b/app/controllers/admin/diagnostics_controller.rb index ffe78e15c91..83d1fb2924f 100644 --- a/app/controllers/admin/diagnostics_controller.rb +++ b/app/controllers/admin/diagnostics_controller.rb @@ -3,7 +3,7 @@ class Admin::DiagnosticsController < Admin::AdminController skip_before_filter :check_xhr def memory_stats - render text: memory_report, content_type: Mime::TEXT + render text: memory_report(class_report: params.key?(:full)), content_type: Mime::TEXT end def dump_heap @@ -24,7 +24,7 @@ class Admin::DiagnosticsController < Admin::AdminController protected - def memory_report + def memory_report(opts={}) begin # ruby 2.1 GC.start(full_mark: true) @@ -35,23 +35,25 @@ class Admin::DiagnosticsController < Admin::AdminController classes = {} - ObjectSpace.each_object do |o| - begin - next if o == classes + if opts[:class_report] + 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 + 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 + classes = classes.sort{|a,b| b[1] <=> a[1]}[0..40].map{|klass, count| "#{klass}: #{count}"} 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}"} < 0 ? classes.join("\n") : "Class report omitted use ?full=1 to include it"} TEXT + end end