一.分配原则
优先分配到Eden
大对象直接分配到老年代
长期存活的对象分配到老年代
空间分配担保
动态对象年龄判断
二.Eden区域
-verbose:gc
-XX:+PrintGCDetails
-XX:+UseSerialGC
-Xms20m
-Xmx20m
-Xmn10m
-XX:SurvivorRatio=8
-XX:+PrintGCDetails is deprecated. Will use -Xlog:gc* instead.
byte[] bytes = new byte[2 * 1024 * 1024];
byte[] bytes1 = new byte[2 * 1024 * 1024];
byte[] bytes2 = new byte[2 * 1024 * 1024];
byte[] bytes6 = new byte[4 * 1024 * 1024];
System.gc();
三.大对象进入老年代
原因:大对象一般存活周期长,若分配到Eden区域,采用复制算法,GC频繁,降低性能
四.长期存活的对象进入老年代
-XX:MaxTenuringThreshold 默认15
并非严格执行
五.空间分配担保
若开启空间分配担保,向老年代借用内存,存在风险
-xx:+HandlePromotionFailure
六.逃逸分析与栈上分配
逃逸分析 目标:分析对象的作用域
public class T3 {
public T3 t;
/*方法返回T3对象,发生逃逸*/
public T3 getInstance() {
return t == null ? new T3() : t;
}
/*为成员属性赋值,发生逃逸*/
public void s1() {
this.t = new T3();
}
/*对象的作用域仅在当前方法中有效,没有发生逃逸*/
public void s2() {
T3 t3 = new T3();
}
/*引用成员变量的值,发生逃逸*/
public void s3() {
T3 instance = getInstance();
}
}