源码解析

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

java运行的设置:

-Djava.lang.Integer.IntegerCache.high=250
-Dhigh=250
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);
}

结果: 250 250 null 250

为什么对于java.lang.Integer.IntegerCache.high这个设置的参数值用System.getProperty获取不到, 但是用sun.misc.VM.getSavedProperty是可以获取到的?

原因如下:

为了将JVM系统所需要的参数和用户使用的参数区别开, java.lang.System.initializeSystemClass在启动时,会将启动参数保存在两个地方:

1、sun.misc.VM.savedProps中保存全部JVM接收的系统参数。 JVM会在启动时,调用java.lang.System.initializeSystemClass方法,初始化该属性。 同时也会调用sun.misc.VM.saveAndRemoveProperties方法,从java.lang.System.props中删除以下属性:

  sun.nio.MaxDirectMemorySize
  sun.nio.PageAlignDirectMemory
  sun.lang.ClassLoader.allowArraySyntax
  java.lang.Integer.IntegerCache.high
  sun.zip.disableMemoryMapping
  sun.java.launcher.diag

以上罗列的属性都是JVM启动需要设置的系统参数,所以为了安全考虑和隔离角度考虑,将其从用户可访问的System.props分开。

2、java.lang.System.props中保存除了以下JVM启动需要的参数外的其他参数。

sun.nio.MaxDirectMemorySize
sun.nio.PageAlignDirectMemory
sun.lang.ClassLoader.allowArraySyntax
java.lang.Integer.IntegerCache.high
sun.zip.disableMemoryMapping
sun.java.launcher.diag