《jdk8u源码分析》2.JLI_Launch

src/share/bin/java.c::JLI_Launch

/*
 * Entry point.
 */
int
JLI_Launch(int argc, char ** argv,              /* main argc, argc */
        int jargc, const char** jargv,          /* java args */
        int appclassc, const char** appclassv,  /* app classpath */
        const char* fullversion,                /* full version defined */
        const char* dotversion,                 /* dot version defined */
        const char* pname,                      /* program name */
        const char* lname,                      /* launcher name */
        jboolean javaargs,                      /* JAVA_ARGS */
        jboolean cpwildcard,                    /* classpath wildcard*/
        jboolean javaw,                         /* windows-only javaw */
        jint ergo                               /* ergonomics class policy */
)
{
    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;

    //1.如果javaw==true,初始化MFC窗体
    //2.根据环境变量_JAVA_LAUNCHER_DEBUG的取值决定是否输出JVM Trace信息
    //  - 如果_JAVA_LAUNCHER_DEBUG==1,输出JVM Trace信息
    InitLauncher(javaw);
    //打印Launcher状态信息
    DumpState();
    //JVM Trace打印命令行参数
    if (JLI_IsTraceLauncher()) {
        int i;
        /**
         * Command line args:
         * argv[0] = java
         * argv[1] = -jar
         * argv[2] = test.jar
         * /
        printf("Command line args:\n");
        for (i = 0; i < argc ; i++) {
            printf("argv[%d] = %s\n", i, argv[i]);
        }
        AddOption("-Dsun.java.launcher.diag=true", NULL);
    }

    /*
     * Make sure the specified version of the JRE is running.
     *
     * There are three things to note about the SelectVersion() routine:
     *  1) If the version running isn't correct, this routine doesn't
     *     return (either the correct version has been exec'd or an error
     *     was issued).
     *  2) Argc and Argv in this scope are *not* altered by this routine.
     *     It is the responsibility of subsequent code to ignore the
     *     arguments handled by this routine.
     *  3) As a side-effect, the variable "main_class" is guaranteed to
     *     be set (if it should ever be set).  This isn't exactly the
     *     poster child for structured programming, but it is a small
     *     price to pay for not processing a jar file operand twice.
     *     (Note: This side effect has been disabled.  See comment on
     *     bugid 5030265 below.)
     */
    //加载Manifest判断JRE Version是否有效
    SelectVersion(argc, argv, &main_class);

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

    if (!IsJavaArgs()) {
    	//根据是否配置命令行参数:-XX:NativeMemoryTracking=
    	//决定是否设置环境变量:NMT_LEVEL_${PID}=value,用以内存跟踪
        SetJvmEnvironment(argc,argv);
    }

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

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

	//1. 加载Microsoft C Runtime Library:%JRE_HOME%\\bin\\${jvmtype}\\jvm.dll
	//2. 加载jvm:%JRE_HOME%\\bin\\${jvmtype}\\jvm.dll
    if (!LoadJavaVM(jvmpath, &ifn)) {
        return(6);
    }

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

	//39449 micro seconds to LoadJavaVM
    JLI_TraceLauncher("%ld micro seconds to LoadJavaVM\n",
             (long)(jint)Counter2Micros(end-start));

	//移除命令行第一条命令:
	//argv[0] = C:\Tools\Java\open-jre1.8.0_202\bin\java.exe
    ++argv;
    --argc;

    if (IsJavaArgs()) {
        /* Preprocess wrapper arguments */
        //优化-J开头的命令行参数 && 展开-cp | -classpath配置项通配符
        TranslateApplicationArgs(jargc, jargv, &argc, &argv);
        //添加可选参数:
        //1. -Denv.class.path=	-> CLASSPATH
        //2. -Dapplication.home=	-> APP_HOME
	    //3. -Djava.class.path=	-> 取决于:宏定义变量JAVA_ARGS是否存在
        if (!AddApplicationOptions(appclassc, appclassv)) {
            return(1);
        }
    } else {
        /* Set default CLASSPATH */
        //如果环境变量:CLASSPATH 未定义,默认设置为当前目录:"."
        cpath = getenv("CLASSPATH");
        if (cpath == NULL) {
            cpath = ".";
        }
        //添加可选参数:-Djava.class.path=当前目录下的所有jar文件路径
        SetClassPath(cpath);
    }

    /* Parse command line options; if the return value of
     * ParseArguments is false, the program should exit.
     */
    //剥离以'-'开头的参数并设置相应的jvm可选参数
    //mode:LM_UNKNOWN | LM_CLASSPATH | LM_JAR
    //what:
    //1. 如果是jar包启动,what值为jar包路径:test.jar | D:\workdir\study\out\artifacts\test\test.jar
    //2. 如果是Class启动,what值为class完整名:com.johnjoe.study.Test
    if (!ParseArguments(&argc, &argv, &mode, &what, &ret, jrepath))
    {
        return(ret);
    }

    /* Override class path if -jar flag was specified */
    //jar包启动
    if (mode == LM_JAR) {
    	//重置可选参数:-Djava.class.path=
        SetClassPath(what);     /* Override class path */
    }

    /* set the -Dsun.java.command pseudo property */
    //添加可选参数:-Dsun.java.command=${java.exe完整路径} [ ${主程序完整名} | ${jar包}] ${命令行参数}
    SetJavaCommandLineProp(what, argc, argv);

    /* Set the -Dsun.java.launcher pseudo property */
    //添加可选参数:-Dsun.java.launcher=SUN_STANDARD
    SetJavaLauncherProp();

    /* set the -Dsun.java.launcher.* platform properties */
    //(**Linux only**)添加可选参数:-Dsun.java.launcher.pid=
    SetJavaLauncherPlatformProps();

    return JVMInit(&ifn, threadStackSize, argc, argv, mode, what, ret);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: jdk_8.0.1310.11_64是指Java Development Kit (JDK)的版本号为8.0.1310.11,适用于64位操作系统的一个软件包。JDK是一个用于开发和运行Java程序的集成开发环境(IDE)和软件开发工具。 Java是一种跨平台的编程语言,它允许开发人员编写一次代码并在不同操作系统上运行。JDK是用于编写、编译和运行Java程序的必备工具。其中的"8.0.1310.11_64"表示的是JDK的具体版本号。 JDK 8是Java平台的一个重要版本,它包括许多新的功能和改进。此版本添加了Lambdas表达式、函数式接口、新的日期和时间API、对并行处理的增强支持等特性。通过使用JDK 8,开发人员可以编写更简洁、高效和灵活的代码。 对于64位操作系统的用户而言,他们可以从JDK_8.0.1310.11_64中受益。64位操作系统能够更好地处理大量的内存和数据,提供更好的性能和稳定性。因此,通过安装并使用这个特定版本的JDK,开发人员可以在64位操作系统上获得最佳的Java开发体验。 總之,JDK_8.0.1310.11_64是Java开发工具包的一个版本,适用于64位操作系统。它为开发人员提供了许多强大的功能和改进,使他们能够更轻松、高效地开发和运行Java程序。无论是用于学习、开发商业应用还是其他项目,JDK 8都是一个非常有价值的工具。 ### 回答2: jdk_8.0.1310.11_64是Java开发工具包(JDK)的一个版本号。JDK是用于Java应用程序开发的软件包,它包含了Java编译器(javac)和Java运行时环境(JRE),以及其他开发工具和库。 具体来说,jdk_8.0.1310.11_64代表JDK 8的一个更新版本。JDK 8是Java平台的一个主要版本,引入了许多新的特性和改进。它是Java SE 8的一部分,SE代表标准版,是最常用的Java平台版本之一。 该版本号中的64表示针对64位操作系统进行优化。现代计算机通常使用64位操作系统,相比32位操作系统具有更大的内存寻址能力和更高的系统性能。 这个特定的版本号中的小数部分(0.1310.11)表示该版本的具体修订和bug修复。Java开发团队经常发布修订版本来解决已知的问题和改进软件的稳定性和性能。这意味着jdk_8.0.1310.11_64是JDK 8系列的第1310个修订版本中的第11个修订版本。 总而言之,jdk_8.0.1310.11_64是Java开发工具包(JDK)中特定版本的标识符,它提供了用于Java应用程序开发的工具和库,是Java平台的一部分,在64位操作系统上进行了优化,并包含了对该版本的修订和bug修复。 ### 回答3: JDK 8是指Java Development Kit 8,是Java开发环境的软件包。而8.0.1310.11_64是JDK 8的特定版本号。 JDK是用于开发和编译Java程序的工具包。它包括编译器、调试器和其他一些用于开发Java应用程序的工具。JDK 8是Java平台的一个主要版本,由Oracle公司开发和维护。 版本号中的8.0.1310.11_64具体解释如下: - 8表示JDK 8的主要版本号,它标识了该版本的Java平台的主要特性和改进。 - 0表示次要版本号,它标识了该版本的Java平台的增量更新和改进。 - 1310表示更新版本号,它表示具体的补丁和错误修复。 - 11表示构建号,它是一个唯一的标识符,用于区分不同构建的JDK。 - 64表示该版本的JDK是64位系统的版本。在计算机体系结构中,32位和64位是指处理器的数据宽度,64位系统具有更高的性能和更大的内存访问能力。 因此,JDK 8.0.1310.11_64是Java开发工具包的版本号,表示它是适用于64位操作系统的Java开发工具包的特定版本,该版本包含了JDK 8平台的主要特性、增量更新、错误修复以及构建号的唯一标识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值