簡體   English   中英

Java終結器,真正需要什么任務

[英]Java Finalizers, what tasks are really necessary

ArrayList<Object> foo;
Object[] bar;

典型的終結者會做

foo = null;
bar = null;

我的問題是,將ArrayList調用終結器將其持有的所有指針設置為null,還是我必須單步執行該列表,

for(i=1; i<foo.size(); i++) foo.set(i,null); ???

另一個問題:對於數組,我是否需要將其任何內容設置為null,例如

for(i=1; i<bar.length; i++) bar[i] = null;

還是整個內存塊都被丟棄並且其中的任何指針超出范圍就足夠了嗎?

抱歉,如果問題很愚蠢。

看完答案后,我發現沒有什么可以自己實現的。

一些消息來源表明,如果發生類似這種事情(記憶式飲食應用程序),則說明設計不當。

我的核心問題是:經常做

struct = new LargeStructure();

難忘的記憶嗎?

還是只需要存儲其中一種結構?

順便說一句:問題發生在運行tomcat的web應用程序中,並且只有一個會話活動,該會話將所描述的指針作為會話變量保存。

當不再引用所有對象時,它們將自動被垃圾收集器用於GC。 您不必擔心。 如果將數組引用設置為null ,則在沒有其他實時引用該數組對象的情況下,該數組對象本身就有資格使用GC,如果不再有任何實時引用,則該數組的元素也將具有GC的資格。 。

根據文檔

protected void finalize() throws Throwable

當垃圾回收確定不再有對該對象的引用時,由垃圾回收器在對象上調用 子類覆蓋finalize方法以處置系統資源或執行其他清除。

在GC檢測到對象不再可訪問之后,並且在實際上回收該對象使用的內存之前,將調用finalize()方法。 如果對象永遠不會變得無法訪問,或者GC無法運行,則可能永遠不會調用finalize()

您可以嘗試通過調用System.runFinalization()來強制JVM調用finalize() ()

運行任何未完成的對象的終結方法。

調用該方法表明,Java虛擬機將花更多的精力來運行已發現被丟棄但尚未運行其finalize方法的對象的finalize方法。 當控件從方法調用返回時,Java虛擬機將盡最大努力完成所有出色的終結工作。

從理論上講,終結器使您可以對對象執行最新的任務,然后再由垃圾回收將其回收。 但是,實際上並不能保證會調用它們,因此它們不是很有用。

您不必在finalizer塊中將對象的引用設置為null 終結器通常用於最后機會關閉資源,這不是一個好習慣,但是終結器可以為您提供資源管理的安全網。

我的問題是,將ArrayList調用終結器將其持有的所有指針設置為null,還是我必須單步執行該列表,

ArrayList不會調用終結器,終結器線程會這樣做,但是您不必為此擔心。 而且,您不必遍歷列表並最終確定自己的元素。 Java Garbage Collector會為您解決這個問題,並在代碼中其他任何地方都未引用的情況下選擇這些對象。

另一個問題:對於數組,我是否需要將其任何內容設置為null,例如

不,和上面一樣。 要記住的重要一點是,您沒有引用數組中的任何值,也沒有引用數組本身,如果您希望它被垃圾收集器拾取。

暫無
暫無

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

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