[英]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.