回答
您可以使用-XX
標誌爲JRE選擇您選擇的垃圾回收器。
Tuning Garbage Collection with the 5.0 Java TM Virtual Machine
此外,還可以使用JConsole監控垃圾收集。
我知道你可以選擇你的垃圾收集器,但是我感興趣的是找出JVM爲我選擇了哪個收集器;誰知道,也許它甚至可能根據使用情況即時改變策略! – 2011-02-18 03:28:20
@垃圾收集器人機工程學(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
好吧,這並不能真正爲您提供正在使用的GC。有趣的是,UseSerialGC,UseParallelOldGC,UseParallelGC,UseConcMarkSweepGC的'getVMOption'輸出全部報告'false'。 – 2011-02-21 06:56:33
對不起,我應該在發佈之前嘗試過:-(。我以爲我過去曾經爲此使用過它... – 2011-02-22 23:27:47
這應該會給你可能針對JVM運行的GC,通過觀察collectionCount屬性看看它們是否正在使用 – 2012-01-16 23:05:34
不是你的問題的直接答案,但我相信這就是你要找的。
參考1說:
在運行 服務器虛擬機,垃圾收集器服務器級計算機( GC) 已從之前的系列 收集器更改爲並行收集器
參考2說:
與J2SE 5.0,開始時 應用程序啓動時,啓動 可以嘗試檢測 應用程序是否在 「服務器級」的機器上運行,並且,如果因此,使用 Java HotSpot服務器虛擬 機器(服務器VM)而不是 Java HotSpot客戶端虛擬機 (客戶端VM)。
此外,參考2表示:
注意:對於Java SE 6,的 定義中的服務器級計算機是一個與 至少2個CPU和 物理存儲器中的至少2GB 。
從這個信息,你可以知道,如果該框是一個服務器(根據2),那麼它將使用並行GC。你也可以推斷它在運行時不會改變GC。
如果您深入瞭解文檔,您可以找到非服務器機器的正確答案。
下面是關於如何以編程方式獲取GC信息的一些信息,但它看起來好像可能需要GC的名稱。麻煩。
http://blogs.oracle.com/poonam/entry/how_to_programmatically_obtain_gc
編輯:嘗試ManagementFactory.getGarbageCollectorMXBeans()
並通過返回的列表進行迭代。其中之一將是積極的。
java -XX:+PrintCommandLineFlags -version
將向您顯示默認垃圾回收器。我還發現以下頁面很有用,詳細說明了各種操作系統的默認垃圾收集器。
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
-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]
這意味着正在使用年輕一代的並行垃圾收集。 「分配失敗」意味着垃圾收集開始,因爲年輕代堆部分沒有足夠的空間。
此命令打印運行的JVM的GC類型:
jmap -heap <pid> | grep GC
對於現代計算機(多CPU,大內存),JVM將其檢測爲服務器計算機,並使用默認Parallel GC
,除非您可以明確指定要通過JVM標誌使用哪個gc。
e.g
jmap -heap 26806 | grep GC
輸出:
並行GC 8線程(S)
- 1. 垃圾收集器
- 2. 查找垃圾收集器最後一次在.NET中運行
- 3. OCaml的垃圾收集幻象類型
- 4. 垃圾收集和運行時間類型信息
- 5. Node.js的垃圾收集器
- 6. 是否收集垃圾價值類型?
- 7. 垃圾收集器可以用於哪種應用程序?
- 8. 垃圾收集
- 9. 如何查看java正在使用哪個垃圾收集器
- 10. 類垃圾收集任務
- 11. 在RAD中運行垃圾回收器
- 12. Renderscript和垃圾收集器
- 13. 垃圾收集器閃存
- 14. 垃圾收集器asp.net
- 15. 垃圾收集器vs池
- 16. .NET垃圾收集器
- 17. 垃圾收集器Flash Player
- 18. Jruby,垃圾收集器,Redis
- 19. SpiderMonkey垃圾收集器
- 20. 如何確定垃圾收集器正在收集哪些對象?
- 21. 找出什麼對象垃圾收集器正在發佈:
- 22. 執行Java垃圾收集器
- 23. 垃圾收集java
- 24. DoctrineCommonCache垃圾收集?
- 25. Java垃圾收集
- 26. C#垃圾收集
- 27. Java垃圾收集
- 28. WeakEvent垃圾收集
- 29. GWT垃圾收集
- 30. 單身正在收集垃圾?
我很好奇,你爲什麼要這些信息。 – casablanca 2011-02-17 04:12:27
對人體工程學非常好奇,特別是針對GC,並希望在實踐中看到它 - 在創建生產建議之前;嘗試jvisualvm,沒有喜悅。 – 2011-02-17 04:36:43