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

【Java中的JVM启动流程】

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

【Java中的JVM启动流程】

学习打卡--Java中的JVM启动流程
  • 一、JVM启动流程源码
  • 二、根据源码可以了解大致流程
  • 三、顺便提下
  • 总结

一、JVM启动流程源码
java.c 187--235中的方法,可在源码中去阅读
{
    int mode = LM_UNKNOWN;
    char *what = NULL;
    char *cpath = 0;
    char *main_class = NULL;
    int ret;
    InvocationFunctions ifn;
    jlong start, end;
    char jvmpath[MAXPATHLEN];
    char jrepath[MAXPATHLEN];
    char jvmcfg[MAXPATHLEN];

    _fVersion = fullversion;
    _dVersion = dotversion;
    _launcher_name = lname;
    _program_name = pname;
    _is_java_args = javaargs;
    _wc_enabled = cpwildcard;
    _ergo_policy = ergo;

    InitLauncher(javaw);
    DumpState();
    if (JLI_IsTraceLauncher()) {
        int i;
        printf("Command line args:n");
        for (i = 0; i < argc ; i++) {
            printf("argv[%d] = %sn", i, argv[i]);
        }
        AddOption("-Dsun.java.launcher.diag=true", NULL);
    }

    
SelectVersion(argc, argv, &main_class);

    CreateExecutionEnvironment(&argc, &argv,
                               jrepath, sizeof(jrepath),
                               jvmpath, sizeof(jvmpath),
                               jvmcfg,  sizeof(jvmcfg));

    if (!IsJavaArgs()) {
        SetJvmEnvironment(argc,argv);
    }

    ifn.CreateJavaVM = 0;
    ifn.GetDefaultJavaVMInitArgs = 0;

    if (JLI_IsTraceLauncher()) {
        start = CounterGet();
    }

    if (!LoadJavaVM(jvmpath, &ifn)) {
        return(6);
    }

    if (JLI_IsTraceLauncher()) {
        end   = CounterGet();
    }

    JLI_TraceLauncher("%ld micro seconds to LoadJavaVMn",
             (long)(jint)Counter2Micros(end-start));

    ++argv;
    --argc;

    if (IsJavaArgs()) {
        
        TranslateApplicationArgs(jargc, jargv, &argc, &argv);
        if (!AddApplicationOptions(appclassc, appclassv)) {
            return(1);
        }
    } else {
        
        cpath = getenv("CLASSPATH");
        if (cpath == NULL) {
            cpath = ".";
        }
        SetClassPath(cpath);
    }

    
    if (!ParseArguments(&argc, &argv, &mode, &what, &ret, jrepath))
    {
        return(ret);
    }

    
    if (mode == LM_JAR) {
        SetClassPath(what);     
    }

    
    SetJavaCommandLineProp(what, argc, argv);

    
    SetJavaLauncherProp();

    
    SetJavaLauncherPlatformProps();

    return JVMInit(&ifn, threadStackSize, argc, argv, mode, what, ret);
}
二、根据源码可以了解大致流程

1、SelectVersion,从jar包中manifest文件或者命令行读取用户使用的JDK版本,判断当前版本是否合适。

2、CreateExecutionEnvironment,设置执行环境参数

3、LoadJavaVM,加载libjvm动态链接库,从中获取JNI_CreateJavaVM,JNI_GetDefaultJavaVMInitArgs和JNI_GetCreatedJavaVMs三个函数的实现,其中JNI_CreateJavaVM是JVM初始化的核心入口,具体实现在hotspot目录中

4、ParseArguments 解析命令行参数,如-version,-help等参数在该方法中解析的

5、SetJavaCommandLineProp 解析形如-Dsun.java.command=的命令行参数

6、SetJavaLauncherPlatformProps 解析形如-Dsun.java.launcher.*的命令行参数

7、JVMInit,通过JVMInit->ContinueInNewThread->ContinueInNewThread0->pthread_create创建了一个新的线程,执行JavaMain函数,主线程pthread_join该线程,在JavaMain函数中完成虚拟机的初始化和启动。

三、顺便提下

java程序运行在JVM(java虚拟机)中,而JVM运行在操作系统之上,JVM内部做了不同操作系统之间的适配,所以,操作系统之间的差异性并不会影响输出结果的一致性。
这即是Java的一次编写,处处运行

总结

以上就是今天要讲的内容,本文仅仅简单介绍了JVM的启动流程,供学习记录

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

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

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