2010-09-01 34 views
1

假設我正在執行一個jvm,垃圾收集沒有並行運行。那是當GC執行我的主線程時被暫停。Java垃圾收集 - 如何找到當它被調用時運行的方法

有沒有一種方法可以指定哪個方法正在運行GC調用的當前時刻?我知道我可以獲得有關時間的信息,但這還不夠。 我假設這樣的分析信息對於JVM來說很容易提供,因爲它只是返回每個停止線程堆棧的最頂層元素(堆棧幀)的問題。

謝謝。

+0

什麼樣的收集(伊甸園,倖存者清除,終身,全面的GC)你有興趣嗎?在現代Sun JVM的默認配置下,eden可以非常頻繁地收集(如果創建了許多對象,則很容易每秒處理幾次),但是在某些程序的整個生命週期中可能沒有一個完整的GC。 – 2010-09-01 20:57:04

回答

2

一般沒有。 如果那麼您可以將其作爲供應商特定的擴展。

問題是,爲什麼你想知道?

+1

我目前正在做一些基準測試。我想知道在基準測試方法執行時GC是否被調用。 – kourdoun 2010-09-01 20:20:40

4

我想你要確保垃圾收集不應該影響你的基準測試。 一些想法:

  1. 垃圾收集是你的軟件的一部分,它總是會影響你的軟件,所以它應該在你的基準來表示。
  2. 多次測量您的功能並忽略結果中最慢的3%。
  3. 在啓動計時器之前調用System.gc()。
0

如果您對JMX具有訪問權限,您可以看到內存消耗,並且出現尖峯的地方也有垃圾回收。

看到什麼方法正在運行並不精確,但是從棧頂開始,您可以通過String.equals()知道nothingt。