XX:PretenureSizeThreshold 的意思是超过这个值的时候,对象直接在old区分配内存
默认值是0,意思是不管多大都是先在eden中分配内存:
http://www.reins.altervista.org/java/gc1.4.2_faq.html
实际确认一下:
启动参数:
-Xms2048m
-Xmx2048m
-Xmn1024m
-XX:+UseConcMarkSweepGC
-XX:+PrintFlagsFinal
实际代码:
public static void main(String[] args) throws Exception {
byte[] array = new byte[700*1024*1024];
for(MemoryPoolMXBean memoryPoolMXBean: ManagementFactory.getMemoryPoolMXBeans()){
System.out.println(memoryPoolMXBean.getName()+" total:"+memoryPoolMXBean.getUsage()
.getCommitted()
+" used:"+memoryPoolMXBean.getUsage().getUsed());
}
}
查看到结果:
uintx PretenureSizeThreshold = 0 {product}
Par Eden Space total:859045888 used:785546168
Par Survivor Space total:107347968 used:0
CMS Old Gen total:1073741824 used:0
当超过eden区的大小的时候,直接分配到old区。
比如: byte[] array = new byte[90010241024];
Par Eden Space total:859045888 used:51542952
Par Survivor Space total:107347968 used:0
CMS Old Gen total:1073741824 used:943718416
可以看到是没有ygc的:
启动参数增加:-XX:PretenureSizeThreshold=100000000
byte[] array = new byte[200*1024*1024];
Par Eden Space total:859045888 used:51542952
Par Survivor Space total:107347968 used:0
CMS Old Gen total:1073741824 used:209715216