[英]Java Assignment Memory Leaks
我必須假設以下方法不會泄漏內存:
public final void setData(final Integer p_iData)
{
data = p_iData;
}
data
是某類的屬性。
每次調用該方法時, new Integer
都將替換當前存在的data
引用。 那么當前/舊數據發生了什么?
Java必須在幕后做點什么; 否則,每次分配對象時我們都必須將任何對象置零。
簡單解釋:
垃圾收集器會定期查看系統中的所有對象,並查看實時引用中不再可訪問的對象。 它釋放了任何不再可達的對象。
請注意,您的方法根本不會創建新的Integer
對象。 例如,可以一次又一次地傳遞對同一個Integer
對象的引用。
垃圾收集的現實比這復雜得多:
Java是一種垃圾收集語言。
一旦沒有對象的實時引用,它就有資格進行垃圾回收。 收集器不時運行並將回收對象的內存。
簡而言之,您的代碼是100%正確的,並沒有泄漏內存。
最終會收集垃圾。
如果沒有對data
引用,java的垃圾收集器將清理舊數據並釋放內存
實際上,由於Integer是一個非原始類型的對象,因此該行:
data = p_iData;
正在更新參考。
現在,GC將檢查this.data
過去指向的舊對象,以確定是否沒有更多對該對象的引用。 如果沒有,那么該對象將被銷毀並釋放內存(稍后會被釋放)
如果先前由數據引用的對象不再被從任何正在運行的線程引用的任何對象結構引用,則它有資格進行垃圾收集。 GC在后台由Java執行以釋放未使用對象的內存。
我想在一些代碼中向您展示一個示例:
int x;
x=10;
x=20;
最初,我再次將x分配給10個x到20的第一個參考內存將由Java GC處理。 Java GC是一個連續運行的線程,檢查未引用的內存並清理它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.