簡體   English   中英

Java分配內存泄漏

[英]Java Assignment Memory Leaks

我必須假設以下方法不會泄漏內存:

public final void setData(final Integer p_iData)
{
    data = p_iData;
}

data是某類的屬性。

每次調用該方法時, new Integer都將替換當前存在的data引用。 那么當前/舊數據發生了什么?

Java必須在幕后做點什么; 否則,每次分配對象時我們都必須將任何對象置零。

簡單解釋:

垃圾收集器會定期查看系統中的所有對象,並查看實時引用中不再可訪問的對象。 它釋放了任何不再可達的對象。

請注意,您的方法根本不會創建新的Integer對象。 例如,可以一次又一次地傳遞對同一個Integer對象的引用。

垃圾收集的現實比這復雜得多:

  • 現代GC往往是代際的 ,假設大多數對象都是短命的,因此它不需要經常檢查整個(可能很大)的堆; 它可以經常檢查“最近”對象的活躍度
  • 對象可以有終結器 - 代碼在垃圾回收之前運行。 這通過一個循環延遲了這些對象的垃圾收集,並且該對象甚至可以通過使其自身可達而“復活”自身
  • 現代GC可以並行收集,並有許多調整選項

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.

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