Java系统属性是如何从主机派生的?

Joe*_*ney 4 java jvm environment-variables jvm-hotspot

默认情况下,JVM中有一组可用的系统属性,如此处所述.热点在哪里派生?

user.home必须在不同的操作系统上以不同的方式确定属性,我正在寻找执行此操作的代码.

And*_*ter 5

我知道它在OpenJDK中,但我还没有找到它

一种常见的方法是从mercurial存储库中检出OpenJDK源代码树,并使用某种find命令来查找您要查找的内容.在那种情况下,一个简单的

$ find . -type f -exec grep "user\.home" {} \; -print
Run Code Online (Sandbox Code Playgroud)

导致./jdk/src/windows/native/java/lang/java_props_md.c(和其他操作系统的类似文件,如./jdk/src/solaris/native/java/lang/java_props_md.c)有功能

java_props_t *
GetJavaProperties(JNIEnv* env) { ... }
Run Code Online (Sandbox Code Playgroud)

在此函数中,系统属性值通过特定于操作系统的API读取.

该函数Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props)在源文件中调用,该文件./jdk/src/share/native/java/lang/System.c再次声明为本机方法./jdk/src/share/classes/java/lang/System.java:

private static native Properties initProperties(Properties props);
Run Code Online (Sandbox Code Playgroud)

最后的初始化序列有点棘手:

  • java.lang.System有一个静态初始化程序,它调用本机registerNatives()方法.
  • 这个本机方法调用java.lang.System.initializeSystemClass()(再次是Java).
  • initializeSystemClass()最后调用上面提到的本机initProperties()方法来创建和初始化系统属性.