package gc;
/**
* -Xmx8m -Xms8m -XX:+PrintGC -XX:+DoEscapeAnalysis
*
* @author Rainfyl
*
*/
public class GCTest1 {
private static void alloc() {
byte[] bytes = new byte[2];
bytes[0] = 1;
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
System.out.println(start);
for (int i = 0; i < 1000000000; i++) {
alloc();
}
System.out.println(System.currentTimeMillis() - start);
}
}
逃逸:当一个对象的指针被多个方法或线程引用时,我们称这个指针发生了逃逸,一般情况返回对象、对全局变量的赋值一般都会发生逃逸。
逃逸分析:用来分析这种逃逸现象的方法称为逃逸分析
逃逸分析优化-栈上分配:栈上分配的意思是方法内局部变量(未发生逃逸)生成的实例在栈上分配,不用在堆中分配,分配完成后,继续在调用栈内执行,最后线程结束,栈空间被回收,局部变量对象也被回收。
没有加逃逸分析:
.......
[GC (Allocation Failure) 2124K->588K(7680K), 0.0001805 secs]
[GC (Allocation Failure) 2124K->588K(7680K), 0.0001549 secs]
[GC (Allocation Failure) 2124K->588K(7680K), 0.0002598 secs]
[GC (Allocation Failure) 2124K->588K(7680K), 0.0003025 secs]
[GC (Allocation Failure) 2124K->588K(7680K), 0.0003102 secs]
[GC (Allocation Failure) 2124K->588K(7680K), 0.0002052 secs]
[GC (Allocation Failure) 2124K->588K(7680K), 0.0001924 secs]
[GC (Allocation Failure) 2124K->588K(7680K), 0.0002133 secs]
[GC (Allocation Failure) 2124K->588K(7680K), 0.0002278 secs]
9030
加了逃逸分析:
[GC (Allocation Failure) 1536K->568K(7680K), 0.0007765 secs]
[GC (Allocation Failure) 2104K->584K(7680K), 0.0006076 secs]
[GC (Allocation Failure) 2120K->600K(7680K), 0.0005939 secs]
6
在时间上差异明显