JavaSE

-XX:PretenureSizeThreshold 的默认值和

2018-04-21  本文已影响0人  黄云斌huangyunbin

XX:PretenureSizeThreshold 的意思是超过这个值的时候,对象直接在old区分配内存

默认值是0,意思是不管多大都是先在eden中分配内存:

http://www.reins.altervista.org/java/gc1.4.2_faq.html

image.png

实际确认一下:

启动参数:

-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的:


image.png

启动参数增加:-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

可以看到设置的话是可以生效的。

上一篇 下一篇

猜你喜欢

热点阅读