java应用程序的启动在在/hotspot/src/share/tools/launcher/java.c的main()函数中,而在虚拟机初始化过程中,将创建并启动Java的Main线程。最后将调用JNIEnv的CallStaticVoidMethod()来执行main方法。Ca ...
java应用程序的启动在在/hotspot/src/share/tools/launcher/java.c的main()函数中,而在虚拟机初始化过程中,将创建并启动Java的Main线程。最后将调用JNIEnv的CallStaticVoidMethod()来执行main方法。
CallStaticVoidMethod()对应的jni函数为jni_CallStaticVoidMethod,定义在/hotspot/src/share/vm/prims/jni.cpp中,而jni_CallStaticVoidMethod()又调用了jni_invoke_static(),jni_invoke_static()通过JavaCalls的call()发起对Java方法的调用
所有来自虚拟机对Java函数的调用最终都将由JavaCalls模块来完成,JavaCalls将通过call_helper()来执行Java方法并返回调用结果,并最终调用StubRoutines::call_stub()来执行Java方法:
1 // do call 2 { JavaCallWrapper link(method, receiver, result, CHECK); 3 { HandleMark hm(thread); // HandleMark used by HandleMarkCleaner 4 5 StubRoutines::call_stub()( 6 (address)&link, 7 // (intptr_t*)&(result->_value), // see NOTE above (compiler problem) 8 result_val_address, // see NOTE above (compiler problem) 9 result_type,10 method(),11 entry_point,12 args->parameters(),13 args->size_of_parameters(),14 CHECK15 );16 17 result = link.result(); // circumvent MS C++ 5.0 compiler bug (result is clobbered across call)18 // Preserve oop return value across possible gc points19 if (oop_result_flag) {20 thread->set_vm_result((oop) result->get_jobject());21 }22 }23 }
海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com
原标题:Java Main如何被执行?
关键词:JAVA
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。