2011-02-17 40 views
46

發佈JSE 5人體工程學旨在爲您自動選擇適當類型的垃圾收集器(等等)。找到哪種類型的垃圾收集器正在運行

我想知道是否有任何方法來確認/知道垃圾回收器的類型和JVM人機工程學選擇/目前設置的性能目標。

+0

我很好奇,你爲什麼要這些信息。 – casablanca 2011-02-17 04:12:27

+2

對人體工程學非常好奇,特別是針對GC,並希望在實踐中看到它 - 在創建生產建議之前;嘗試jvisualvm,沒有喜悅。 – 2011-02-17 04:36:43

回答

-1

您可以使用-XX標誌爲JRE選擇您選擇的垃圾回收器。

Tuning Garbage Collection with the 5.0 Java TM Virtual Machine

此外,還可以使用JConsole監控垃圾收集。

+2

我知道你可以選擇你的垃圾收集器,但是我感興趣的是找出JVM爲我選擇了哪個收集器;誰知道,也許它甚至可能根據使用情況即時改變策略! – 2011-02-18 03:28:20

+0

@垃圾收集器人機工程學(http://download.oracle.com/javase/1.5.0/docs/guide/vm/gc-ergonomics.html)中的ryan-fernandes,在運行服務器VM的服務器級機器上,默認的GC是並行收集器,否則是串行收集器。 – Garbage 2011-02-18 08:35:25

0
+1

好吧,這並不能真正爲您提供正在使用的GC。有趣的是,UseSerialGC,UseParallelOldGC,UseParallelGC,UseConcMarkSweepGC的'getVMOption'輸出全部報告'false'。 – 2011-02-21 06:56:33

+0

對不起,我應該在發佈之前嘗試過:-(。我以爲我過去曾經爲此使用過它... – 2011-02-22 23:27:47

+0

這應該會給你可能針對JVM運行的GC,通過觀察collectionCount屬性看看它們是否正在使用 – 2012-01-16 23:05:34

9

不是你的問題的直接答案,但我相信這就是你要找的。

根據的Java 6文檔12(不僅僅是Java 5中):

參考1說:

在運行 服務器虛擬機,垃圾收集器服務器級計算機( GC) 已從之前的系列 收集器更改爲並行收集器

參考2說:

與J2SE 5.0,開始時 應用程序啓動時,啓動 可以嘗試檢測 應用程序是否在 「服務器級」的機器上運行,並且,如果因此,使用 Java HotSpot服務器虛擬 機器(服務器VM)而不是 Java HotSpot客戶端虛擬機 (客戶端VM)。

此外,參考2表示:

注意:對於Java SE 6,的 定義中的服務器級計算機是一個與 至少2個CPU和 物理存儲器中的至少2GB 。

從這個信息,你可以知道,如果該框是一個服務器(根據2),那麼它將使用並行GC。你也可以推斷它在運行時不會改變GC。

如果您深入瞭解文檔,您可以找到非服務器機器的正確答案。

11
import java.lang.management.GarbageCollectorMXBean; 
import java.lang.management.ManagementFactory; 
import java.util.List; 

public class GCInformation { 

    public static void main(String[] args) { 
      try { 
        List<GarbageCollectorMXBean> gcMxBeans = ManagementFactory.getGarbageCollectorMXBeans(); 

        for (GarbageCollectorMXBean gcMxBean : gcMxBeans) { 
          System.out.println(gcMxBean.getName()); 
          System.out.println(gcMxBean.getObjectName()); 
        } 

      } catch (RuntimeException re) { 
        throw re; 
      } catch (Exception exp) { 
        throw new RuntimeException(exp); 
      } 
    } 
} 

例如試試下面的命令來了解各種GC類型

java -XX:+PrintCommandLineFlags GCInformation 
java -XX:+PrintCommandLineFlags -XX:+UseParallelGC GCInformation 
java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -XX:+UseParNewGC GCInformation 
java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -XX:-UseParNewGC GCInformation 
1
-XX:+PrintGC 
-XX:+PrintGCDetails 

這將打印使用什麼GC。在我的情況下,它會打印:

[GC (Allocation Failure) [PSYoungGen: 348192K->32K(348672K)] 356792K->8632K(1048064K), 0.0111518 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 

這意味着正在使用年輕一代的並行垃圾收集。 「分配失敗」意味着垃圾收集開始,因爲年輕代堆部分沒有足夠的空間。

1

此命令打印運行的JVM的GC類型:

jmap -heap <pid> | grep GC

對於現代計算機(多CPU,大內存),JVM將其檢測爲服務器計算機,並使用默認Parallel GC,除非您可以明確指定要通過JVM標誌使用哪個gc。

e.g

jmap -heap 26806 | grep GC

輸出:

並行GC 8線程(S)