src/share/vm/services/diagnosticCommand.cpp
Print this page
*** 34,43 ****
--- 34,44 ----
#include "services/diagnosticFramework.hpp"
#include "services/writeableFlags.hpp"
#include "services/heapDumper.hpp"
#include "services/management.hpp"
#include "utilities/macros.hpp"
+ #include "oops/objArrayOop.inline.hpp"
PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
void DCmdRegistrant::register_dcmds(){
// Registration of the diagnostic commands
*** 54,63 ****
--- 55,66 ----
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<SetVMFlagDCmd>(full_export, true, false));
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<VMDynamicLibrariesDCmd>(full_export, true, false));
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<VMUptimeDCmd>(full_export, true, false));
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<SystemGCDCmd>(full_export, true, false));
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<RunFinalizationDCmd>(full_export, true, false));
+ DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<HeapInfoDCmd>(full_export, true, false));
+ DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<FinalizerInfoDCmd>(full_export, true, false));
#if INCLUDE_SERVICES // Heap dumping/inspection supported
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<HeapDumpDCmd>(DCmd_Source_Internal | DCmd_Source_AttachAPI, true, false));
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<ClassHistogramDCmd>(full_export, true, false));
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<ClassStatsDCmd>(full_export, true, false));
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<ClassHierarchyDCmd>(full_export, true, false));
*** 329,338 ****
--- 332,389 ----
JavaCalls::call_static(&result, klass,
vmSymbols::run_finalization_name(),
vmSymbols::void_method_signature(), CHECK);
}
+ void HeapInfoDCmd::execute(DCmdSource source, TRAPS) {
+ Universe::heap()->print_on(output());
+ }
+
+ void FinalizerInfoDCmd::execute(DCmdSource source, TRAPS) {
+ ResourceMark rm;
+
+ output()->print_cr("Unreachable instances awaiting finalization:");
+
+ Klass *k = SystemDictionary::Finalizer_klass();
+ instanceKlassHandle klass(THREAD, k);
+ JavaValue result(T_ARRAY);
+
+ // We are calling lang.ref.Finalizer::getFinalizerHistogram() method
+ // and expect it to return array of FinalizerHistogramEntry as Object[]
+ // actual class layout should be:
+ // java.lang.ref.Finalizer$FinalizerHistogramEntry
+ // - klass: 'java/lang/ref/Finalizer$FinalizerHistogramEntry'
+ // - private 'count' 'I'
+ // - private 'name' 'Ljava/lang/String;'
+
+ #ifdef _LP64
+ int count_field_offset = 12;
+ int name_field_offset = 16;
+ if (!UseCompressedOops) {
+ count_field_offset = 16;
+ name_field_offset = 24;
+ }
+ #else
+ int count_field_offset = 8;
+ int name_field_offset = 12;
+ #endif
+
+ JavaCalls::call_static(&result, klass,
+ vmSymbols::get_finalizer_histogram_name(),
+ vmSymbols::void_object_array_signature(), CHECK);
+
+ objArrayOop result_oop = (objArrayOop) result.get_jobject();
+ for (int i = 0; i < result_oop->length(); ++i) {
+ oop element_oop = result_oop->obj_at(i);
+ oop str_oop = element_oop->obj_field(name_field_offset);
+ char *name = java_lang_String::as_utf8_string(str_oop);
+ int count = element_oop->int_field(count_field_offset);
+ output()->print_cr("Class %s - %d", name, count);
+ }
+ }
+
+
#if INCLUDE_SERVICES // Heap dumping/inspection supported
HeapDumpDCmd::HeapDumpDCmd(outputStream* output, bool heap) :
DCmdWithParser(output, heap),
_filename("filename","Name of the dump file", "STRING",true),
_all("-all", "Dump all objects, including unreachable objects",