jvm源码学习过程中的纪要,比较杂,存个档而已
下载xcode缺失的libstdc库,执行库中install.sh文件链接到xcode里
virtualspace.cpp:584:14: error: ordered comparison between pointer and zero ('char *' and 'int')
if (base() > 0) {
修复方法
base() != NULL
运行jdk的问题
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGILL (0x4) at pc=0x000000010abdfaa8, pid=70795, tid=3331
#
# JRE version: OpenJDK Runtime Environment (9.0) (slowdebug build 9-internal+0-adhoc.jsonqiao.openjdk9)
# Java VM: OpenJDK 64-Bit Server VM (slowdebug 9-internal+0-adhoc.jsonqiao.openjdk9, mixed mode, tiered, compressed oops, serial gc, bsd-amd64)
# Problematic frame:
# V [libjvm.dylib+0xd18aa8] PerfData::~PerfData()+0x8
#
# No core dump will be written. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /Users/jsonqiao/IdeaProjects/demo/openjdk9/make/hs_err_pid70795.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
#
[error occurred during error reporting (), id 0x4]
make[3]: *** [/Users/jsonqiao/IdeaProjects/demo/openjdk9/build/macosx-x86_64-normal-serverANDclient-slowdebug/jdk/_packages_attribute.done] Abort trap: 6
make[2]: *** [exploded-image-optimize] Error 2
make[2]: *** Waiting for unfinished jobs....
修复方法
www.jianshu.com/p/34c8a8c37… stackoverflow.com/questions/5…
解决gdb编译问题
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.debugger</key>
<true/>
</dict>
</plist>
签名
codesign --entitlements gdb-entitlement.xml -fs gdb-cert $(which gdb)
java.base/shared/native/libjli/java.c
jvm启动入口
openjdk9/jdk/src/java.base/share/native/launcher/main.c
调用链
main -> JLI_Launch(java.c) -> JVMInit -> JavaMain(java.c) -> InitializeJVM -> Threads::create_vm
JLI_Launch函数
该函数会调用CreateExecutionEnvironment(jdk/src/java.base/unix/native/libjli/java_md_solinux.c)初始化jvmpath参数
JDK_Version_Init
/hotspot/src/share/vm/runtime/java.cpp 加载本地库,即jdk中本地函数的实现,在此时java在jdk/include/libjava.so
LoadJavaVM
在ubuntu系统下的函数所在位置
jdk/src/java.base/unix/native/libjli/java_md_solinux.c
该函数会根据入参jvmpath 动态打开链接库libjvm.so文件,获取JNI_CreateJavaVM函数句柄,存储到InvocationFunctions->CreateJavaVM 指针上
JNI_CreateJavaVM
函数所在文件
hotspot/src/share/vm/prims/jni.cpp
JavaMain InitializeJVM
Threads::create_vm
JLI_Launch -> JVMInit -> JavaMain -> InitializeJVM -> Threads::create_vm
RegisterNatives hotspot/src/share/vm/prims/jni.cpp
LoadMainClass jdk/java.base/share/native/libjli/java.c
GetLauncherHelperClass
FindBootStrapClass jdk/java.base/share/native/libjli/java_md_common.c
JVM_FindClassFromBootLoader hotspot/src/share/vm/prims/jvm.cpp
findBootClass
查找
NativeLookup::lookup
hotspot/src/share/vm/prims/ InterpreterRuntime::prepare_native_call()
lookup_special_native
jvm解释器
hotspot/src/share/vm/prims/nativelookup.cpp hotspot/src/share/vm/prims/interpreter/interpreterRuntime.cpp lookup -> lookupbase -> lookupentry -> lookupstyle -> lookupstyle -> lookup_special_native
类加载
instanceKlassHandle SystemDictionary::load_instance_class(Symbol* class_name, Handle class_loader, TRAPS)(/home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:1520 入口)
#0 ClassLoader::load_class (name=0x7ffff607f300, search_append_only=255, __the_thread__=0x7ffff607f1f0) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/classLoader.cpp:1408
#1 0x00007ffff73dd4ad in SystemDictionary::load_instance_class (class_name=0x7ffff4f4d0b8, class_loader=..., __the_thread__=0x7ffff0018800)
at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:1520
#2 0x00007ffff73daaf1 in SystemDictionary::resolve_instance_class_or_null (name=0x7ffff4f4d0b8, class_loader=..., protection_domain=..., __the_thread__=0x7ffff0018800)
at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:840
#3 0x00007ffff73d8f6c in SystemDictionary::resolve_or_null (class_name=0x7ffff4f4d0b8, class_loader=..., protection_domain=..., __the_thread__=0x7ffff0018800)
at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:248
#4 0x00007ffff73d896c in SystemDictionary::resolve_or_fail (class_name=0x7ffff4f4d0b8, class_loader=..., protection_domain=..., throw_error=true, __the_thread__=0x7ffff0018800)
at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:185
#5 0x00007ffff73d8ce6 in SystemDictionary::resolve_or_fail (class_name=0x7ffff4f4d0b8, throw_error=true, __the_thread__=0x7ffff0018800) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:228
#6 0x00007ffff73df5d6 in SystemDictionary::initialize_wk_klass (id=SystemDictionary::Object_klass_knum, init_opt=0, __the_thread__=0x7ffff0018800)
at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:2115
#7 0x00007ffff73df783 in SystemDictionary::initialize_wk_klasses_until (limit_id=SystemDictionary::Cloneable_klass_knum, start_id=@0x7ffff607f964: SystemDictionary::Object_klass_knum, __the_thread__=0x7ffff0018800)
at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:2132
#8 0x00007ffff6f57ef0 in SystemDictionary::initialize_wk_klasses_through (end_id=SystemDictionary::Class_klass_knum, start_id=@0x7ffff607f964: SystemDictionary::Object_klass_knum, __the_thread__=0x7ffff0018800)
at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.hpp:435
#9 0x00007ffff73df913 in SystemDictionary::initialize_preloaded_classes (__the_thread__=0x7ffff0018800) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:2156
#10 0x00007ffff73df482 in SystemDictionary::initialize (__the_thread__=0x7ffff0018800) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:2080
#11 0x00007ffff7445574 in Universe::genesis (__the_thread__=0x7ffff0018800) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/memory/universe.cpp:317
#12 0x00007ffff7447edd in universe2_init () at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/memory/universe.cpp:977
#13 0x00007ffff6e0ed5b in init_globals () at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/runtime/init.cpp:122
#14 0x00007ffff741b5f2 in Threads::create_vm (args=0x7ffff607fe20, canTryAgain=0x7ffff607fd2b) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/runtime/thread.cpp:3630
#15 0x00007ffff6e9dcc6 in JNI_CreateJavaVM_inner (vm=0x7ffff607fe78, penv=0x7ffff607fe80, args=0x7ffff607fe20) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/prims/jni.cpp:3937
#16 0x00007ffff6e9e05d in JNI_CreateJavaVM (vm=0x7ffff607fe78, penv=0x7ffff607fe80, args=0x7ffff607fe20) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/prims/jni.cpp:4032
#17 0x00007ffff7fb8434 in InitializeJVM (pvm=0x7ffff607fe78, penv=0x7ffff607fe80, ifn=0x7ffff607fed0) at /home/jsonqiao/code/jdk9/jdk/src/java.base/share/native/libjli/java.c:1481
#18 0x00007ffff7fb5228 in JavaMain (_args=0x7fffffffabe0) at /home/jsonqiao/code/jdk9/jdk/src/java.base/share/native/libjli/java.c:408
#19 0x00007ffff7d71609 in start_thread (arg=<optimized out>) at pthread_create.c:477
#20 0x00007ffff7ecf293 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
类初始化
jvm的解释器截止jvm生成的字节码指令new(入口 interpreterRuntime.cpp:148)
#0 InstanceKlass::initialize_impl (this_k=..., __the_thread__=0x7ffff607f1c0) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/oops/instanceKlass.cpp:702
#1 0x00007ffff6e10951 in InstanceKlass::initialize (this=0x100015418, __the_thread__=0x7ffff0018800) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/oops/instanceKlass.cpp:474
#2 0x00007ffff6e333bf in InterpreterRuntime::_new (thread=0x7ffff0018800, pool=0x7ffff501f288, index=209) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp:148
blog.csdn.net/raintungli/… instanceKlass::initialize() -> instanceKlass::initialize_impl() -> instanceKlass::link_class() -> instanceKlass::link_class_impl() -> instanceKlass::rewrite_class() -> Rewriter::rewrite() -> Rewriter::Rewriter() -> methodOopDesc::link_method() link_mehod()
void methodOopDesc::link_method(methodHandle h_method, TRAPS) {
assert(_i2i_entry == NULL, "should only be called once");
assert(_adapter == NULL, "init'd to NULL" );
assert( _code == NULL, "nothing compiled yet" );
// Setup interpreter entrypoint
assert(this == h_method(), "wrong h_method()" );
address entry = Interpreter::entry_for_method(h_method); //找到对应的方法 entry
assert(entry != NULL, "interpreter entry must be non-null");
// Sets both _i2i_entry and _from_interpreted_entry
set_interpreter_entry(entry); //并且把entry设置到了methodoop中
...
完成_entry_table entry数组的初始化 /hotspot/src/share/vm/runtime/init.cpp:115 init.cpp:115 -->templateInterpreter:initalize() ->TemplateInterpreterGenerator:() ->TemplateInterpreterGenerator:generate_all()
- 生成本地方法的入口 TemplateInterpreterGenerator::generate_method_entry 类解释器初始化 interpreter_init方法 /hotspot/src/share/vm/interpreter/templateInterpreter.cpp:56:initialize()
jvm 最开始初始化 jint init_globals() TemplateInterpreterGenerator::generate_all
预先初始化类
ClassLoader::load_class (name=0x7ffff607f300, search_append_only=255, __the_thread__=0x7ffff607f1f0) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/classLoader.cpp:1408
1408 instanceKlassHandle ClassLoader::load_class(Symbol* name, bool search_append_only, TRAPS) {
(gdb) bt
#0 ClassLoader::load_class (name=0x7ffff607f300, search_append_only=255, __the_thread__=0x7ffff607f1f0) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/classLoader.cpp:1408
#1 0x00007ffff73dd4ad in SystemDictionary::load_instance_class (class_name=0x7ffff4f4d0b8, class_loader=..., __the_thread__=0x7ffff0018800)
at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:1520
#2 0x00007ffff73daaf1 in SystemDictionary::resolve_instance_class_or_null (name=0x7ffff4f4d0b8, class_loader=..., protection_domain=..., __the_thread__=0x7ffff0018800)
at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:840
#3 0x00007ffff73d8f6c in SystemDictionary::resolve_or_null (class_name=0x7ffff4f4d0b8, class_loader=..., protection_domain=..., __the_thread__=0x7ffff0018800)
at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:248
#4 0x00007ffff73d896c in SystemDictionary::resolve_or_fail (class_name=0x7ffff4f4d0b8, class_loader=..., protection_domain=..., throw_error=true, __the_thread__=0x7ffff0018800)
at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:185
#5 0x00007ffff73d8ce6 in SystemDictionary::resolve_or_fail (class_name=0x7ffff4f4d0b8, throw_error=true, __the_thread__=0x7ffff0018800) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:228
#6 0x00007ffff73df5d6 in SystemDictionary::initialize_wk_klass (id=SystemDictionary::Object_klass_knum, init_opt=0, __the_thread__=0x7ffff0018800)
at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:2115
#7 0x00007ffff73df783 in SystemDictionary::initialize_wk_klasses_until (limit_id=SystemDictionary::Cloneable_klass_knum, start_id=@0x7ffff607f964: SystemDictionary::Object_klass_knum, __the_thread__=0x7ffff0018800)
at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:2132
#8 0x00007ffff6f57ef0 in SystemDictionary::initialize_wk_klasses_through (end_id=SystemDictionary::Class_klass_knum, start_id=@0x7ffff607f964: SystemDictionary::Object_klass_knum, __the_thread__=0x7ffff0018800)
at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.hpp:435
#9 0x00007ffff73df913 in SystemDictionary::initialize_preloaded_classes (__the_thread__=0x7ffff0018800) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:2156
#10 0x00007ffff73df482 in SystemDictionary::initialize (__the_thread__=0x7ffff0018800) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:2080
#11 0x00007ffff7445574 in Universe::genesis (__the_thread__=0x7ffff0018800) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/memory/universe.cpp:317
#12 0x00007ffff7447edd in universe2_init () at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/memory/universe.cpp:977
#13 0x00007ffff6e0ed5b in init_globals () at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/runtime/init.cpp:122
#14 0x00007ffff741b5f2 in Threads::create_vm (args=0x7ffff607fe20, canTryAgain=0x7ffff607fd2b) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/runtime/thread.cpp:3630
#15 0x00007ffff6e9dcc6 in JNI_CreateJavaVM_inner (vm=0x7ffff607fe78, penv=0x7ffff607fe80, args=0x7ffff607fe20) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/prims/jni.cpp:3937
#16 0x00007ffff6e9e05d in JNI_CreateJavaVM (vm=0x7ffff607fe78, penv=0x7ffff607fe80, args=0x7ffff607fe20) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/prims/jni.cpp:4032
#17 0x00007ffff7fb8434 in InitializeJVM (pvm=0x7ffff607fe78, penv=0x7ffff607fe80, ifn=0x7ffff607fed0) at /home/jsonqiao/code/jdk9/jdk/src/java.base/share/native/libjli/java.c:1481
#18 0x00007ffff7fb5228 in JavaMain (_args=0x7fffffffabd0) at /home/jsonqiao/code/jdk9/jdk/src/java.base/share/native/libjli/java.c:408
#19 0x00007ffff7d71609 in start_thread (arg=<optimized out>) at pthread_create.c:477
#20 0x00007ffff7ecf293 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
main函数类加载
#0 ClassLoader::load_class (name=0x7ffff607f720, search_append_only=255, __the_thread__=0x7ffff607f710) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/classLoader.cpp:1408
#1 0x00007ffff73dd4ad in SystemDictionary::load_instance_class (class_name=0x7ffff02e2d20, class_loader=..., __the_thread__=0x7ffff0018800)
at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:1520
#2 0x00007ffff73daaf1 in SystemDictionary::resolve_instance_class_or_null (name=0x7ffff02e2d20, class_loader=..., protection_domain=..., __the_thread__=0x7ffff0018800)
at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:840
#3 0x00007ffff73d8f6c in SystemDictionary::resolve_or_null (class_name=0x7ffff02e2d20, class_loader=..., protection_domain=..., __the_thread__=0x7ffff0018800)
at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:248
#4 0x00007ffff73d8fe5 in SystemDictionary::resolve_or_null (class_name=0x7ffff02e2d20, __the_thread__=0x7ffff0018800) at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/classfile/systemDictionary.cpp:253
#5 0x00007ffff6ed2809 in JVM_FindClassFromBootLoader (env=0x7ffff0018a28, name=0x7ffff7fc1ff3 "sun/launcher/LauncherHelper") at /home/jsonqiao/code/jdk9/hotspot/src/share/vm/prims/jvm.cpp:792
#6 0x00007ffff7fbbb6d in FindBootStrapClass (env=0x7ffff0018a28, classname=0x7ffff7fc1ff3 "sun/launcher/LauncherHelper") at /home/jsonqiao/code/jdk9/jdk/src/java.base/unix/native/libjli/java_md_common.c:345
#7 0x00007ffff7fb84a1 in GetLauncherHelperClass (env=0x7ffff0018a28) at /home/jsonqiao/code/jdk9/jdk/src/java.base/share/native/libjli/java.c:1492
#8 0x00007ffff7fb8869 in LoadMainClass (env=0x7ffff0018a28, mode=1, name=0x555555559340 "Hello") at /home/jsonqiao/code/jdk9/jdk/src/java.base/share/native/libjli/java.c:1564
#9 0x00007ffff7fb5998 in JavaMain (_args=0x7fffffffabd0) at /home/jsonqiao/code/jdk9/jdk/src/java.base/share/native/libjli/java.c:505
#10 0x00007ffff7d71609 in start_thread (arg=<optimized out>) at pthread_create.c:477
#11 0x00007ffff7ecf293 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95