2013-04-17 213 views
8

我在Java中有一個對性能非常敏感的應用程序。 (我知道我實際上應該使用C或其他東西,但它現在是Java)。我試圖避免創建和扔掉對象。現在我需要知道還有多少垃圾正在收集。Java垃圾收集時間?

我如何知道?

如果可能,我想有一個以毫秒或納秒爲單位的數字,它不需要安裝更多的軟件。

+0

剛擡起頭C不比Java更好 - 這取決於你如何比較它們。 [這是一個很好的比較我發現](http://www.azulsystems.com/blog/cliff/2009-09-06-java-vs-c-performanceagain),底線是C比Java更好內存佔用和數字密集型程序,而Java具有更好的多線程支持。我幾年前閱讀的一篇研究論文發現(如果讓Java的堆增長到C堆的4倍),許多Sourceforge程序在兩種語言之間沒有性能差異。 –

+0

[爲低延遲調優垃圾回收](http://stackoverflow.com/questions/2781797/tuning-garbage-collections-for-low-latency) –

回答

2

您可以使用VisualVm,這正是您所需要的。
正如你可以看到下面你有GC活動,這是非常有用的:

enter image description here

你身邊有很多細節有GC的活動,如:堆使用,CPU使用率,對象實例的使用等

7

您可以使用像VisualVM這樣的工具來監視應用程序活動。確保你使用適當的GC算法。

甲骨文JVM提供了多種類型的垃圾收集器的:

  • 吞吐量集電極
  • 併發低暫停集電極
  • 增量(有時稱爲列車)低暫停集電極:

閱讀更多關於這些收藏家here

+0

+1關於垃圾回收類型的不錯建議:) – Stephan

+2

+1注意:對於低GC程序,VisualVM將創建比應用程序更多的垃圾。爲此我使用YourKit,這不是免費的。我會從VisualVM開始。 –

+0

VisualVM還有一個名爲VisualGC的插件,可以實時顯示每個堆空間正在發生的情況。 https://blogs.oracle.com/klc/entry/visualgc_plugin_for_visualvm – Aaron

1

Jprofiler,它啓用兩個內存配置文件來評估內存使用情況和動態分配泄漏以及CPU分析以評估線程衝突。

7

或者你可以讓JVM打印GC活動。這些設置,我有:

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintTenuringDistribution -Xloggc:logs/gc.log 

GC活動打印到文件日誌/ gc.log ..