簡體   English   中英

JVisualVM可以“堆轉儲”按鈕釋放內存嗎?

[英]Can JVisualVM “Heap Dump” button release memory?

我有一個非常奇怪的問題。 我正在開發一個基於Eclipse Equinox的OSGi應用程序; 它是使用OSGi Log Service(Equinox實現)開發的,現在我正在使用Apache Felix OSGi Log Service實現進行測試。

在API /代碼方面,一切正常:OSGi日志服務是標准的,所以我可以毫無問題地從Equinox交換到Felix。

但是,我觀察到了這種奇怪的行為:我啟動了應用程序作為控制台程序,在控制台上查看日志輸出,並且我將它連接到JVisualVM以分析內存使用情況; JVisualVM圖顯示了一個80 MB的已用堆。

13個小時后,平均堆大小達到220 MB,所以我決定分析堆轉儲,並按下“堆轉儲”按鈕:在此操作之后,JVisualVM圖顯示使用的堆為20(分鍾)-35 (最大)MB(?!?!),這個值是常數。

“堆轉儲”操作可以釋放近200 mbs嗎? 如果是,為什么?

我從未在Equinox OSGi Log Service實現中看到這種行為,所以我懷疑Felix Log涉及這個問題......

謝謝

“堆轉儲”操作可以釋放近200 mbs嗎? 如果是,為什么?

是的,它可以。 我沒有研究過代碼,但我很確定它調用HotSpotDiagnosticMXBean.dumpHeap並將第二個參數設置為true(如果你將其稱為jconsole或JVisualVM的MBeans擴展,則它是默認值)。 根據我的經驗,這樣做會在轉儲堆之前觸發一個顯式的gc,這可能就是“為什么?”的答案。

為什么你甚至被GC困擾? 如果內存已正確釋放,則無需擔心。 但是如果你想發現導致堆增長的原因(即使你不是泄漏),請看看: 如何在沒有垃圾收集的情況下在Java 5上進行堆轉儲?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM