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



JVM中默认有一组可用的系统属性,如下所述。它们在Hotspot的哪里派生?

user.home这样的属性必须在不同的操作系统上以不同的方式确定,我正在寻找能够做到这一点的代码。

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

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

$ find . -type f -exec grep "user.home" {} ; -print

导致./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) { ... }

在这个函数中,系统属性值是通过操作系统特定的API读取的。

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

private static native Properties initProperties(Properties props);

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

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

最新更新