JVM栈上分配

1.我们都知道JAVA中的对象都是在堆上进行分配,当对象没有被引用的时候,需要依靠GC进行回收内存,如果对象数量较多的时候,会给GC带来较大压力,也间接影响了应用的性能。为了减少临时对象在堆内分配的数量,JVM通过逃逸分析确定该对象不会被外部访问。那就通过标量替换将该对象分解在栈上分配内存,这样该对象所占用的内存空间就可以随栈帧出栈而销毁,减轻了垃圾回收的压力。

2.代码示例

       public static void abc() {
User user = new User();
user.setId(1);
user.setName("lisi");
}
public static void main(String[]args) {

long begin = System.currentTimeMillis();

for (int i = 0;i < 2147483647;i++) {
abc();
}
long end = System.currentTimeMillis();
System.out.println(end-begin);

}

3. JDK1.8是默认开启逃逸分析 

-XX:-DoEscapeAnalysis关闭逃逸分析 结果如下

[GC (Allocation Failure)  286852K->644K(450560K), 0.0005036 secs]
[GC (Allocation Failure)  275588K->644K(439808K), 0.0005167 secs]
[GC (Allocation Failure)  264836K->644K(429568K), 0.0004161 secs]
[GC (Allocation Failure)  254596K->644K(419840K), 0.0006551 secs]
[GC (Allocation Failure)  244868K->644K(410624K), 0.0007289 secs]
[GC (Allocation Failure)  235652K->644K(401920K), 0.0004537 secs]
[GC (Allocation Failure)  226948K->644K(393216K), 0.0005847 secs]

10971

-XX:+DoEscapeAnalysis关闭逃逸分析 结果如下

5

从上面的代码示例可以看出差别还是蛮大的

你可能感兴趣的:(JVM栈上分配)