簡體   English   中英

Java應用程序中的內存泄漏

[英]Memory leak in Java application

我有一個應用程序,其中除其他外使用SSL。 該應用程序的重點是它將無限運行。 現在的問題似乎是隨着時間的流逝,我得到以下圖像:

漏水

現在,從一開始,我就從2點看一看堆轉儲(使用eclipse的Memory Analyzer Tool):1當我的應用達到內存使用率的最高點而最低時(我認為發生了垃圾回收)。 )一開始一切都很好,我的應用程序在終結器隊列中有幾個對象,這些對象消失了。 但是半小時后,沒有任何明顯的原因,盡管發生了垃圾回收,但對終結器類的引用並沒有消失。 它們不斷增加大小,並且有10個引用不斷指向對象和隊列中的下一個終結器。 因此,它實際上是重復的鏈,涉及相同的事物,從未被收集。 雖然這確實在一開始就被收集了。

所以我的問題實際上是2折:第一個問題:突然不被收集的原因可能是什么? (由於我仔細檢查了代碼,因此可以確定我確實關閉了finalizer類所引用的內容(顯然是inputstreams和outputstreams。還有我正在使用的SSL庫中的一些抽象內容,但可以肯定的是,這里沒有什么可以關閉的。我使用的是一般的Client.getConnectionManager()。shutdown(),我想應該可以清除它(開始時是這樣做的)。本身又一遍又一遍,由於某種原因,參考隊列太大,而收集器無法處理呢?

第二個問題是:我將如何解決這個問題? 您所看到的圖像來自Jconsole,當我執行手動GC時,這些圖像全部消失,然后重新開始。

在正確的方向上的任何幫助或推動都將受到贊賞。

我懷疑您根本沒有內存泄漏。 您所擁有的是一個垃圾收集器,不需要進行完整收集。 不會減少程序的性質,但是它確實很小,並且您運行了很長時間也沒有。 當然不足以確認是否存在泄漏。

到目前為止,您看到的內存更改只是“清除”,還沒有任何認真的收集。 給GC一個機會去做。

通常,只有在內存不足的情況下才會發生嚴重收集,因此,當堆的各個子段都裝滿時,期望進行更積極的收集。 現在,您甚至還沒有接近。

具體來說,您告訴Java它可以使用大約90MB的內存,而您目前僅使用25MB的內存。

如果完整的GC清除了這種情況,並將底部內存使用量移回了最初的10MB,則意味着Eden空間 / 幸存者空間很小,並且/或者對象為時過早被提升為舊一代 (這意味着它們只會被收集)當發生完全GC時)。

我建議從調整Eden空間Survivor空間的大小開始。

請查看Tuning Garbage Collector文檔Java VM Options中的標志,例如XX:NewRatioXX:SurvivorRatio以及其他可以優化Garbage Collection的標志。

另請閱讀有關XX:InitialTenuringThresholdXX:MaxTenuringThreshold -這兩個定義了將對象放入Old generation的閾值。 如果使用得當,這兩個對象可使您的對象在Survivor空間中的停留時間更長,並且無需使用Full GC即可收集它們。

它不一定是內存泄漏。 我確實在連續運行數月的程序中發現了這種波動。 一旦發生垃圾收集,它將回到正常階段。 我不確定,但是有時我已經看到使用探查器會使波動劇烈。

暫無
暫無

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

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