浏览 5808 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2014-01-02
-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是可以获取到的? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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里都留有备份。 就是这样了。 |
|
返回顶楼 | |