jdk1.6與1.7垃圾回收

最近項目中遇到了個關於JVM中GC線程數的問題,作一下簡單的總結 html

問題場景: java

server:均爲 sun公司的solaris 系統 CPU 128個 服務器

項目8.1時使用的 java版本:   jdk1.6_u38 升級到9.1後使用jdk1.7_U21 下面兩圖分別爲1.6和1.7時的prstat輸出狀況,可明顯發現1.7的cpu使用狀況增大 oracle



作了一個簡單的測試(測試機型同上)代碼以下,運行時不加任何JVM參數 jsp

public class Test {

    public static void main(String[] args) {
        List<OOM> oom = new ArrayList<OOM>();
        int i = 0;
        int j = 0;
        while (true) {
            oom.add(new OOM());
            i++;
            if (i % 100000 == 0) {
                j++;
                System.out.println("force gc System.gc() " + j + " the i number is " + i);
                System.gc();
                if (i > 0) {
                    try {
                        System.out.println("the program is sleeping");
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    static class OOM {
        private String name;
    }
} 測試

下面兩圖分別爲1.6和1.7的測試的結果,可看到在1.7中大量CPU在運行着,而1.6基本都是sleep 線程

翻閱了一下 oracle官網中的 JVM參數介紹 http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html 發現 server

JDK1.6中對默認的GC 回收方式爲:-XX:-UseParallelGC  年輕代爲並行年老代爲串行,  1.6中引入了新的參數設置-XX:-UseParallelOldGC 年輕代爲並行,年老代也爲並行 htm

而在JDK1.7中默認的GC回收方式則變成了-XX:-UseParallelOldGC io

另外經過在1.6的環境中加上-XX:-UseParallelOldGC次參數能夠看到與1.7任何參數不加 相同的結果

最終在項目加入了 -XX:ParallelGCThreads=<n>來限定gc執行時的線程數,默認若是不加入的話 等於你服務器中CPU的個數(CPU<=8的時候)或者 cpu*5/8 (CP>=8的時候)

相關文章
相關標籤/搜索