src/java.base/share/native/launcher/main.c
main函数返回了JLI_Launch()函数,位于 src/java.base/share/native/libjli/java.c
2 java.c # JLI_Launch()JavaMain()是Java主程序的native调用。
在该方法里会执行虚拟机的初始化,获取Java程序主类及main方法,然后通过JNI调用main方法, 自此,整个JVM进程执行结束,最终退出。
int JavaMain(void *_args) {
JavaMainArgs *args = (JavaMainArgs *) _args; int argc = args->argc; char **argv = args->argv; int mode = args->mode; char *what = args->what;
InvocationFunctions ifn = args->ifn;
JavaVM *vm = 0;
JNIEnv *env = 0;
jclass mainClass = NULL;
jclass appClass = NULL; // 实际启动的应用程序类
jmethodID mainID;
jobjectArray mainArgs; int ret = 0;
jlong start, end;
RegisterThread();
start = CounterGet(); if (!InitializeJVM(&vm, &env, &ifn)) {
JLI_ReportErrorMessage(JVM_ERROR1); exit(1);
} if (showSettings != NULL) {
ShowSettings(env, showSettings);
CHECK_EXCEPTION_LEAVE(1);
} // 显示已解决的模块并继续
if (showResolvedModules) {
ShowResolvedModules(env);
CHECK_EXCEPTION_LEAVE(1);
} // 列出可观察的模块,然后退出
if (listModules) {
ListModules(env);
CHECK_EXCEPTION_LEAVE(1);
LEAVE();
} // 描述一个模块,然后退出
if (describeModule != NULL) {
DescribeModule(env, describeModule);
CHECK_EXCEPTION_LEAVE(1);
LEAVE();
} if (printVersion || showVersion) {
PrintJavaVersion(env, showVersion);
CHECK_EXCEPTION_LEAVE(0); if (printVersion) {
LEAVE();
}
} // 模块在启动时已通过验证,因此退出
if (validateModules) {
LEAVE();
}
if (printXUsage || printUsage || what == 0 || mode == LM_UNKNOWN) {
PrintUsage(env, printXUsage);
CHECK_EXCEPTION_LEAVE(1);
LEAVE();
}
FreeKnownVMs();
if (JLI_IsTraceLauncher()) {
end = CounterGet();
JLI_TraceLauncher("%ld micro seconds to InitializeJVMn",
(long) (jint) Counter2Micros(end - start));
}
if (JLI_IsTraceLauncher()) { int i; printf("%s is '%s'n", launchModeNames[mode], what); printf("App's argc is %dn", argc); for (i = 0; i < argc; i++) { printf(" argv[%2d] = '%s'n", i, argv[i]);
}
}
ret = 1;
mainClass = LoadMainClass(env, mode, what);
CHECK_EXCEPTION_NULL_LEAVE(mainClass);
appClass = GetApplicationClass(env);
NULL_CHECK_RETURN_VALUE(appClass, -1);
mainArgs = CreateApplicationArgs(env, argv, argc);
CHECK_EXCEPTION_NULL_LEAVE(mainArgs); if (dryRun) {
ret = 0;
LEAVE();
}
PostJVMInit(env, appClass, vm);
CHECK_EXCEPTION_LEAVE(1);
mainID = (*env)->GetStaticMethodID(env, mainClass, "main", "([Ljava/lang/String;)V");
CHECK_EXCEPTION_NULL_LEAVE(mainID);
(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);
ret = (*env)->ExceptionOccurred(env) == NULL ? 0 : 1;
LEAVE();
}该方法中调用的InitializeJVM()方法会执行一系列关于虚拟机的分配、挂载、初始化等工作, 且听下回分解



