是否足以將大對象分配給null?我讀過,如果有軟引用,GC不會釋放該對象。
簡短的回答是是的。將一個大對象分配(所有強引用)爲空就足夠了 - 如果你這樣做,垃圾收集器不再將該對象視爲「強可達」。
軟引用在你的情況下不會成爲問題,因爲它保證了在引發OutOfMemoryError
之前可以輕鬆地收集到可輕鬆訪問的對象。他們可能會很好地阻止垃圾收集器立即收集對象(如果他們不這樣做,他們的行爲與弱引用完全相同)。但是這種內存使用將是「臨時的」,因爲如果需要完成分配請求,它將被釋放。
我應該深入清理對象,清除所有列表,將屬性賦值爲空等。
這可能是一個壞主意。如果字段值僅由外部大對象引用,那麼在收集大對象時它們也將被垃圾收集。如果他們不是,那麼引用他們的代碼的其他部分將不會很高興地看到你從他們正在使用的列表中刪除成員!
在最好的情況下,這什麼都不做,最糟糕的情況是這會破壞你的程序。不要讓這種誘惑分散您的注意力,以解決您的對象是否可以強制訪問的唯一實際問題。
JaxB(我使用Java6,JaxB內置)和軟引用呢? JaxB比舊的JibX編組速度更快,但我不知道內存使用情況是否更糟。
我對這些庫的相對時間和空間性能不是特別熟悉。但是總的來說,核心圖書館承擔一個非常強大的「無辜的,直到證實有罪」的態度是安全的。如果存在內存泄漏漏洞,現在可能已經發現,報告並修復了這個漏洞(除非你正在做一些事情)。
如果有內存泄漏,我99.9%確定它是你自己的代碼有問題。
我應該用WeakReference包裝Megacomplex JaxB類還是類似的東西?
這聽起來像你可能會拋出GC「修復」問題,而不考慮實際需要的內容。
如果JaxB類應該被弱引用,那麼無論如何這是一個好主意(它應該已經存在)。但如果不應該,那麼絕對不要這樣做。弱引用更多的是整體語義問題,不應該是專門爲避免內存問題而引入的內容。
如果外部代碼需要對該對象的引用,那麼它需要一個引用 - 沒有什麼魔法可以讓這個實例被垃圾收集,但仍然可用。如果它不需要引用(超出某個特定點),那麼它根本不需要引用 - 更好的是使標準[強]引用無效,或者讓它超出範圍。弱引用是一種特殊情況,通常在你無法完全控制一個對象停止相關的點時使用。這可能是不是這裏的情況。
.hprof文件證明所有發票的所有客戶數據都保留在內存中。
這表明它們確實被引用的時間超過了必要的時間。
好消息是hprof文件將包含正確引用它們的細節。查看您希望獲得GCed的發票實例,並查看引用它的內容並防止它被GCed。然後看看有關問題的課程,看看你是如何期望該引用被釋放,以及爲什麼它沒有在這種情況下。
所有良好的性能/內存調整是基於測量。採取堆轉儲,並檢查實例和引用它們,是您的測量。做到這一點並根據結果採取行動,而不是試圖在WeakReferences中包裝某些東西,希望它可以提供幫助。
在您完成Jaxb處理之後,代碼是否可以引用由Jaxb生成的對象?多長時間?另外,我不知道這是否可行,但是您可以使用構建器,以便在完成編組時可以生成最終結果而不需要特定於Jaxb的對象? – fge