【问题标题】:How are Java system properties derived from the host?Java 系统属性是如何从主机派生的?
【发布时间】:2016-08-28 11:28:11
【问题描述】:

在 JVM 中有一组默认可用的系统属性,as described here。它们是在 Hotspot 的什么地方派生的?

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

【问题讨论】:

  • 这段代码在JVM中。我建议你看一下 OpenJDK 中的源码。
  • 我知道它在 OpenJDK 中,但我还没有找到它。 Hotspot 是一个……相当大的代码库,我不太了解它的组织结构。

标签: java jvm environment-variables jvm-hotspot


【解决方案1】:

我知道它在 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)。
  • initializeSystemClass()最终调用了上面提到的原生initProperties()方法来创建和初始化系统属性。

【讨论】:

  • 你说得对,这是一个懒惰的问题。感谢您的回答!
猜你喜欢
  • 2018-09-30
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 2011-03-03
  • 2010-10-28
  • 2011-08-06
  • 2019-09-08
  • 2021-09-11
相关资源
最近更新 更多