栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

深入解析JVM源码

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

深入解析JVM源码

0 源码1 程序主入口

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()方法会执行一系列关于虚拟机的分配、挂载、初始化等工作, 且听下回分解


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/238386.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号