簡體   English   中英

參考不足和內存泄漏

[英]WeakReference and memory leaks

我使用VisualVM對應用程序進行性能分析,發現堆大小在大約3天內增加了約7MB。 當我使用內存采樣器時,我還看到java.lang.ref.WeakReference在實例編號的前五位中。 WeakReference的數量在增加,GC幾乎沒有效果。

任何想法?

您沒有內存泄漏。

Java的GC僅在堆滿時運行(實際上,由於將堆本身分成幾代,但實際上要復雜一些,但還是要復雜一些),因此除非您填充堆(這很不可能,因為7Mb對於任何堆來說太少的內存)您無法分辨是否存在泄漏。

WeakReferences是小型包裝程序,通過將它們引用的對象標記為GC可識別的對象,實際上有助於防止內存泄漏。 我的猜測是,您將包括某種可以創建大量此類的緩存庫,並且由於堆仍具有足夠的空間,因此無需進行垃圾回收。

同樣,除非您看到GC經常運行並且您的堆大小仍然增加,否則我不會擔心內存問題。

這是一篇很棒的文章

萬一JVM運行完整的GC,WeakReferences是第一個被收集的,但是,它們不能強/弱地到達(強/軟引用必須不包含對它的引用)。 我通常最不擔心WeakReferences,它們最終還是由GC編寫的。 您應該檢查您的GC周期(jstat),看看是否連GC也沒有要求這些參考。 另外,請不要推斷泄漏,您的應用程序在未來幾天可能不一定會增加其內存消耗。 我建議在非生產環境中進行長時間(48小時)的性能測試,並施加大量負載,並查看是否遇到內存問題。

VisualVM使用系統中的資源。 與商業分析器相比,這是其缺點之一。 因此,VisualVM無法輕易看到微小的差異,因為它會產生自己的噪音。

假設您在3天內泄漏了7 MB(我對此表示懷疑)。 您花多少時間修理它? 16 GB的內存成本約為100美元,因此7 MB的成本約為5美分,或大約3秒鍾的時間。 如果它更大,更大,我會更擔心。

暫無
暫無

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

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