[英]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.