HSDB CLIを使ってJavaオブジェクトを調べる

このへん参照してやった。
http://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-JA12-architect-bajaj.pdf



事前準備

export SA_JAVA=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/bin/java


Javaのプロセスを調べる

$ jps
17968 GradleDaemon
17971 DemoApplication
17956 GradleWrapperMain
17800 RemoteMavenServer
17998 Jps


コアダンプを取得

$ sudo gcore -v -o core.17971 17971


HSDB CLIを起動

java -Dsun.jvm.hotspot.debugger.useProcDebugger=true -classpath /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/lib/sa-jdi.jar sun.jvm.hotspot.CLHSDB


取得したコアダンプをアタッチ

hsdb> attach /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/bin/java core.17971
Opening core file, please wait...


Javaオブジェクトを調査

hsdb> class java.lang.Object
java/lang/Object @0x00000007c0000f28
hsdb> inspect 0x00000007c0000f28
Type is InstanceKlass (size of 440)
juint Klass::_super_check_offset: 40
Klass* Klass::_secondary_super_cache: Klass @ null
Array<Klass*>* Klass::_secondary_supers: Array<Klass*> @ 0x000000011c04f088
Klass* Klass::_primary_supers[0]: Klass @ 0x00000007c0000f28
oop Klass::_java_mirror: Oop for java/lang/Class @ 0x00000006c00007f0 Oop for java/lang/Class @ 0x00000006c00007f0
jint Klass::_modifier_flags: 1
Klass* Klass::_super: Klass @ null
Klass* Klass::_subklass: Klass @ 0x00000007c036ba18
jint Klass::_layout_helper: 16
Symbol* Klass::_name: Symbol @ 0x00000001019160b0
AccessFlags Klass::_access_flags: 553648161
markOop Klass::_prototype_header: 5
Klass* Klass::_next_sibling: Klass @ null
u8 Klass::_trace_id: 589824
Klass* InstanceKlass::_array_klasses: Klass @ 0x00000007c00117a8
Array<Method*>* InstanceKlass::_methods: Array<Method*> @ 0x000000011c04f3d0
Array<Method*>* InstanceKlass::_default_methods: Array<Method*> @ null
Array<Klass*>* InstanceKlass::_local_interfaces: Array<Klass*> @ 0x000000011c04f088
Array<Klass*>* InstanceKlass::_transitive_interfaces: Array<Klass*> @ 0x000000011c04f088
Array<u2>* InstanceKlass::_fields: Array<u2> @ 0x000000011c04f3b8
u2 InstanceKlass::_java_fields_count: 0
ConstantPool* InstanceKlass::_constants: ConstantPool @ 0x000000011c04f0f8
ClassLoaderData* InstanceKlass::_class_loader_data: ClassLoaderData @ 0x00007fd16c60d470
u2 InstanceKlass::_source_file_name_index: 48
char* InstanceKlass::_source_debug_extension: char @ null
Array<jushort>* InstanceKlass::_inner_classes: Array<jushort> @ 0x000000011c04f058
int InstanceKlass::_nonstatic_field_size: 0
int InstanceKlass::_static_field_size: 0
u2 InstanceKlass::_static_oop_field_count: 0
int InstanceKlass::_nonstatic_oop_map_size: 0
bool InstanceKlass::_is_marked_dependent: 0
u2 InstanceKlass::_minor_version: 0
u2 InstanceKlass::_major_version: 52
u1 InstanceKlass::_init_state: 4
Thread* InstanceKlass::_init_thread: Thread @ 0x00007fd16e00a800
int InstanceKlass::_vtable_len: 5
int InstanceKlass::_itable_len: 2
u1 InstanceKlass::_reference_type: 0
OopMapCache* InstanceKlass::_oop_map_cache: OopMapCache @ 0x00007fd16c4cd270
JNIid* InstanceKlass::_jni_ids: JNIid @ null
nmethod* InstanceKlass::_osr_nmethods_head: nmethod @ null
BreakpointInfo* InstanceKlass::_breakpoints: BreakpointInfo @ null
u2 InstanceKlass::_generic_signature_index: 0
jmethodID* InstanceKlass::_methods_jmethod_ids: jmethodID @ null
u2 InstanceKlass::_idnum_allocated_count: 14
Annotations* InstanceKlass::_annotations: Annotations @ null
nmethodBucket* InstanceKlass::_dependencies: nmethodBucket @ null
Array<int>* InstanceKlass::_method_ordering: Array<int> @ 0x000000011c04f040
Array<int>* InstanceKlass::_default_vtable_indices: Array<int> @ null