论坛首页 Java企业应用论坛

sun.misc.VM.getSavedProperty和System.getProperty的区别是什么

浏览 5693 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2014-01-02  
java运行的设置:
-Djava.lang.Integer.IntegerCache.high=250
-Dhigh=250

<pre name="code" class="java">
public static void main(String[] args) {
String a = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
String b = sun.misc.VM.getSavedProperty("high");
String c = System.getProperty("java.lang.Integer.IntegerCache.high");
String d = System.getProperty("high");
System.err.println(a);
System.err.println(b);
System.err.println(c);
System.err.println(d);
}
</pre>

结果:
250
250
null
250

为什么对于java.lang.Integer.IntegerCache.high这个设置的参数值用System.getProperty获取不到,但是用sun.misc.VM.getSavedProperty是可以获取到的?
   发表时间:2014-02-05  
首先要注意sun.misc.*都不是标准API,所以请不要依赖它们的行为。

然后来看看具体实现。楼主可能也留意到HotSpot VM上Integer的autobox范围可以通过参数设置:http://rednaxelafx.iteye.com/blog/680746
而它正是用:
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");

来获取那个参数值,而不是通过System.getProperty()。

通常,HotSpot VM所接收的特定的VM参数都是通过-XX:前缀的命令行参数指定的,而传给Java层的system property则是通过-D前缀的参数来指定。

在系统初始化的时候,JVM调用java.lang.System.initializeSystemClass()来初始化System类,而它进一步调用的
java.lang.System.initProperties()会调用到JVM的JVM_InitProperties()函数,来从JVM那边把-D参数都拿到System.properties里。

紧接着,initializeSystemClass()又调用sun.misc.VM.saveAndRemoveProperties()来保存一份“干净”的system properties备份以便JDK内部使用,避免JDK的内部行为受到运行时用户代码对System.properties的修改所干扰。同时saveAndRemoveProperties()也会从System.properties移除一些只供JDK内部使用、用户代码不应该看到的系统属性,例如设置NIO direct memory大小限制的sun.nio.MaxDirectMemorySize属性。这些被移除的系统属性在sun.misc.VM.savedProps里都留有备份。

就是这样了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics