PretenureSizeThreshold

7117 ワード

最近プロジェクトjvmのパラメータを調整して、ゆっくりといくつかのふだんの調整の参のいくつかのノートを整理して忘れましょう

XX:PretenureSizeThreshold


XX:PretenuerSizeThresholdがこの値を超えると、オブジェクトは直接old領域にメモリを割り当てます.
Frequently Asked Questions about Garbage Collection
There is a flag (available in 1.4.2 and later) l-XX:PretenureSizeThreshold= that can be set to limit the size of allocations in the young generation. Any allocation larger than this will not be attempted in the young generation and so will be allocated out of the old generation. The default size for PretenureSizeThreshold is 0 which says that any size can be allocated in the young generation
テストプログラム
参照PretenuerSizeThresholdのデフォルト値と役割
public class PretenureSizeThreshold
{
    /**
     * VM: Args: -Xms20m -Xmx30m -Xmn10m -XX:PretenureSizeThreshold=4m -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+PrintFlagsFinal -XX:+PrintGCDetails -Xloggc:./gc.log 
     * @param args
     */
    public static void main(String[] args)
    {
        //byte[] array = new byte[9*1024*1024];
        byte[] array = new byte[6*1024*1024];
        //byte[] array1 = new byte[1*1024*1024];

        for(MemoryPoolMXBean memoryPoolMXBean: ManagementFactory.getMemoryPoolMXBeans()){
            System.out.println(memoryPoolMXBean.getName() 
                    + "   total:"+memoryPoolMXBean.getUsage().getCommitted()
                    +"   used:"+memoryPoolMXBean.getUsage().getUsed());
        }

        try {
            Thread.sleep(10000);
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

テスト-1

-Xms20m -Xmx30m -Xmn10m 
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseConcMarkSweepGC -XX:+PrintFlagsFinal

下から見ると(1)byte[]array=new byte[9102241024];
Code Cache   total:2555904   used:1221888
Metaspace   total:4980736   used:2877544
Compressed Class Space   total:524288   used:308512
Par Eden Space   total:8388608   used:1359440
Par Survivor Space   total:1048576   used:0
CMS Old Gen   total:10485760   used:9437200

Edenは8 M、2つのSurvivorはそれぞれ1 Mである.Old Genは10 Mである.我々が割り当てたオブジェクトは9 Mであり,Edenより大きいのでOld Gen,used:9437200に直接割り当てる.
(2)byte[]array=new byte[610241024];すべてはEdenに割り当てられています.
Code Cache   total:2555904   used:1224064
Metaspace   total:4980736   used:2879976
Compressed Class Space   total:524288   used:309080
Par Eden Space   total:8388608   used:7650912
Par Survivor Space   total:1048576   used:0
CMS Old Gen   total:10485760   used:0

テスト-2


byte[]array=new byte[610241024];これはVMパラメータです.
-Xms20m -Xmx30m -Xmn10m -XX:PretenureSizeThreshold=4m 
-XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC
-XX:+PrintFlagsFinal -XX:+PrintGCDetails -Xloggc:./gc.log 

Edenは8 M、2つのSurvivorはそれぞれ1 Mである.Old Genは10 Mである.ここでは、PretenuerSizeThreshold=4 Mを設定した後、オブジェクトメモリをOld Genに直接割り当てることができます.
Code Cache   total:2555904   used:1229312
Metaspace   total:4980736   used:2881872
Compressed Class Space   total:524288   used:309080
Par Eden Space   total:8388608   used:1359440
Par Survivor Space   total:1048576   used:0
CMS Old Gen   total:10485760   used:6291472

印刷GCロゴの設定

 -XX:+PrintFlagsFinal -XX:+PrintGCDetails -Xloggc:./gc.log 

[gcviewer]をダウンロード(https://sourceforge.net/projects/gcviewer/)gcログを表示し、gcviewerを起動する
 java -jar gcviewer-1.36-SNAPSHOT.jar

gc logを開くと分析できます