簡體   English   中英

Java中復雜對象的可用內存

[英]Free memory from complex objects in Java

我盡力解釋我的問題。 也許它有點抽象。

我讀了一些關於不在Java代碼中明確調用GC,終結方法,指向null等的文獻。

我有一些大型XML文件(客戶發票)。 使用Jaxb,文件在復雜的Java對象中進行編組。 它的屬性是基本類型(Integer,BigDecimal,String等),但也包括其他復雜類的類,其他類的列表,列表作為屬性的類列表等。

當我用對象做我的東西時,我需要將它從內存中刪除。 有些XML非常大,我可以避免內存泄漏或OutOfMemoryError情況。

所以,我的問題是:

  • 將大對象分配給null是否足夠? 我讀過,如果有軟引用,GC將不會釋放該對象。
  • 我應該深入清除對象,清除所有列表,為屬性分配null等等嗎?
  • 那么JaxB(我使用Java6,內置JaxB)和軟引用呢? JaxB比舊的JibX marshaller更快,但我不知道它在內存使用方面是否更糟。
  • 我應該用WeakReference或類似的東西包裝megacomplex JaxB類嗎?

請原諒我混合Java內存使用概念,JaxB等。我正在研究大型運行進程的穩定性,而.hprof文件證明所有發票的所有客戶數據都保留在內存中。 如果這是一個簡單,基本或罕見的問題,請原諒。

提前致謝

除非其他東西指向大對象(圖形)的某些部分,否則將大對象引用賦值為null就足夠了。

最安全的是,在應用程序運行一段時間后使用分析器,並查看對象引用,並查看是否存在未正確GC的內容。

將大對象分配給null是否足夠? 我讀過,如果有軟引用,GC將不會釋放該對象。

簡短的回答是肯定的 將一個大對象(所有強引用)分配給null就足夠了 - 如果這樣做,垃圾收集器將不再將該對象視為“強烈可訪問”。

在您的情況下,軟引用不會成為問題,因為它保證在OutOfMemoryError之前將軟件可訪問的對象進行垃圾回收。 它們可能會阻止垃圾收集器立即收集對象(如果它們沒有,它們的行為與弱引用完全相同)。 但是這種內存使用將是“臨時的”,因為如果需要滿足分配請求,它將被釋放。

我應該深入清除對象,清除所有列表,為屬性分配null等等嗎?

這可能是一個壞主意。 如果字段值僅由外部大對象引用,則在收集大對象時它們也將被垃圾收集。 如果它們不是,那么引用它們的代碼的其他部分將不會高興地看到您正在從他們正在使用的列表中刪除成員!

在最好的情況下,這沒有任何作用,在最壞的情況下,這將破壞您的程序。 不要讓這種誘惑分散您的注意力,以解決您的物體是否強烈可達的唯一實際問題。

那么JaxB(我使用Java6,內置JaxB)和軟引用呢? JaxB比舊的JibX marshaller更快,但我不知道它在內存使用方面是否更糟。

我對這些庫的相對時間和空間性能並不是特別熟悉。 但總的來說,可以安全地假設一個非常強大的“天真無邪,直到被證明有罪”的態度與核心庫。 如果存在內存泄漏錯誤,那么現在可能已經找到,報告並修復了(除非您正在做一些非常小的事情)。

如果有內存泄漏,我99.9%肯定這是你自己的代碼有問題。

我應該用WeakReference或類似的東西包裝megacomplex JaxB類嗎?

這聽起來像你可能在不考慮實際需要的情況下拋出GC“修復”問題。

如果JaxB類應該被弱引用,那么無論如何這都是一個好主意(它應該已經存在)。 但如果不應該,那么絕對不要這樣做。 弱引用更多地是整體語義的問題,並且不應該是您專門為避免內存問題而引入的內容。

如果外部代碼需要對對象的引用,那么它需要一個引用 - 沒有什么魔法可以讓intance被垃圾收集但仍然可用。 如果它不需要引用(超過某一點),那么它根本不需要一個 - 更好地使標准[強]引用無效,或者讓它超出范圍。 弱參考是一種專業情況,通常在您無法完全控制對象不再相關的點時使用。 可能不是這種情況。

.hprof文件證明所有發票的所有客戶數據都保留在內存中。

這表明它們確實被引用的時間超過了必要的時間。

好消息是hprof文件將包含確切引用它們的詳細信息。 查看您希望已經過GCed的發票實例,並查看引用它的內容並防止它被GCed。 然后查看有問題的類,看看你希望如何釋放該引用,以及為什么它不在這種情況下。

所有良好的性能/內存調整都基於測量。 進行堆轉儲,檢查實例和對它們的引用是您的測量。 執行此操作並對結果執行操作,而不是嘗試將內容包裝在WeakReferences中,希望它可能有所幫助。

你寫了

hprof files evidence that all customers data of all invoices remains in memory. 

你應該用mat來分析它。 http://memoryanalyzer.blogspot.in/上的一些好注意事項

暫無
暫無

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

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