f物件的finalize方法丟擲異常會導致FinalizeThread退出嗎?

2025-03-19 12:50:05 字數 4826 閱讀 9033

1樓:手機使用者

不知道大家有沒有想過如宴粗果f物件的finalize方法拋了乙個沒捕獲的異常,這個finalizerthread會不會退出呢,細心的模祥數讀者看旦首上面的**其實就可以找到答案,runfinalizer方法裡對throwable的異常進行了捕獲,因此不可能出現finalizerthread因異常未捕獲而退出的情況。

2樓:網友

首先,finalize()一定會被執行,但是並不總是那麼及時,原因有二:

1、垃圾**器並不總是工作,只有當記憶體資源告急時,垃圾回高毀收器才會工作;

2、即使垃圾**戚槐備器工作,finalize方法也不一定得到執行,這是由於程式中的其他執行緒的優先順序遠遠高於執行finalize()函式執行緒的優先順序。

因此,當finalize還沒有被執行時,系統的其他資源,比如檔案控制代碼、資料庫連線池等已明唸經消耗殆盡,造成系統崩潰。

第二,如果一種未**獲的異常在使用finalize方法時被丟擲,這個異常不會**獲,finalize方法的終結過程也會終止,造成物件出於破壞的狀態。

第三,第二種情況已經是一種特例,還有其他的情況也會造成物件不會被銷燬,從而浪費記憶體。

第四,垃圾**和finalize方法的執行本身就是對系統資源的消耗,有可能造成程式的暫時停止,因此在程式中儘量避免使用finalize方法。

f物件的finalize方法會執行多次嗎?

3樓:猴敬頓

在f物件的finalize方法裡重新將當前物件賦值,變成可達物件,當這個f物件再次變成不可達時還會執行finalize方法嗎?答案是否定的,因為在執行完第一次finalize方法後,這個f物件已經和之前的finalizer物件剝離了,也就是下次gc的時候不會再發現finalizer物件指向該f物件了,自然也就不會呼叫這個f物件的finalize方法了。

j**a中的finalize()方法

4樓:網友

**integer,要呼叫integer的finalize()方法。你這裡重寫的是gctest的finalize(),自然不會呼叫。自己定義個物件,重寫它的finalize(),再試試。

而且;只是通知jvm,回不**完全看人家心情,就是呼叫了也未必會執行,要想看效果可加一下這句。

5樓:學盡天下學問

所有的類均直接或間接繼承自object類,你這個類沒寫繼承,所以預設繼承自object類,object類是有這個方法的,所以finalize是會執行的。你的book類和terminationcondition不存在繼承關係。

6樓:愛我所愛丶

所有的類,都預設是object的子類。finalize()是object的方法,這裡其實就是呼叫了父類object的finalize方法。目的是垃圾**。

可以去看看object的api

j**a中finalize()方法的使用

7樓:加百列

設計乙個物件重生的**來演示,如下:

具體解析如下:

為方便起見, 把a,b兩個變數所指的記憶體空間就叫做a和b。

a a = new a(new b("allen" , 20)) //此時a和b都是reachable, unfinalized狀態。

a = null ;

這之後, a和b的狀態會在某乙個時刻變成unreachable, unfinalized或者a和b直接變成f-reachable, unfianlized。

然後在某個時刻,gc檢測到a和b處於unfinalized狀態,就將他們新增到f-queue,並將狀態改為f-reachable finalizable。

之後分兩種情況:

1、 gc從f-queue中首先取出a, 並被某個執行緒執行了finalize(),也就相當於被某個活動的執行緒持有, a狀態變成了reachable, finalized.。

此時由於a被c物件所引用,所以之後不會變成unreachable finalized而被銷燬(重生) 與此同時,b由於一直被a所引用,,所以b的狀態變成了reachable, finalizable.。

然後在某個時刻被從f-queue取出, 變成reachable, finalized狀態。

2、gc從f-queue中首先取出b,並被某個執行緒執行了finalize(),狀態變成reachable finalized. 然後a也類似, 變成reachable finalized狀態, 並被c引用,重生。

在j**a垃圾**機制中,怎麼解釋乙個物件的finalize只可能執行一次? 求詳解~

8樓:遊狐之聲

class garbage

protected void finalize()public string tostring()}public class finalizeonce}用**說話。

輸出結果。garbage1

garbage2

garbage2hi

首先g1,g2引用賦值null後,呼叫了gc,執行finalize語句,但是finalize語句裡面 ;

g2的物件並沒有**。

首先列印出。

garbage1

garbage2

接著g2賦值給g3 執行 "hi");

列印出garbage2hi

不過因為這個物件finalize執行過一次了,即使再次呼叫gc,也不會執行finalize語句。

如果把;這行語句註釋掉。

就會列印出。

garbage1

garbage2

nullhi

g3所指向的物件由於執行過finalize,而不會再次執行了。

如果把static garbage g3;改成static garbage g3=new garbage(3);

執行結果就是:

garbage1

garbage2

garbage2hi

garbage3

因為乙個物件的finalize只可能執行一次。

9樓:網友

俺簡單解釋一下吧。不是隻能執行一次,而是只需要執行一次。

這是乙個object的生命流程,那個中文翻譯可能有點偏差:

1 created 建立。

2 in use (strongly reachable) 使用中。

3 invisible 不可視。

4 unreachable 無法使用。

5 collected 被收集。

6 finalized 已終結化。

7 deallocated 消失。

乙個物件object的finalize method是在第5步執行的。

這個物件要被**了。但是在**前,再檢查一遍是否有資源還被這個物件使用,例如file i/o, socket等等。如果有的話,就該放開這個資源。然後到第7步這個物件就要消失了。

怎麼可能對已經不存在的物件再次執行finalize呢?

對於問題補充的答覆。

我提供的生命流程中第6步finalized的要求是: 當物件在執行完finalize()後, 還是不可達狀態。

所以如果在finalize()中使物件object變成可達,這個物件則無法完成生命流程中的第6步。也就無法被**了。

10樓:網友

因為乙個人只能死一次!

怎樣才能讓finalize方法總會被呼叫評論

11樓:霸王粽子

將物件變成null

然後呼叫。這樣就通知了finalize該**了,但也不是一定會**例如下面**:

description:

@author 仁聰。

date 2018年4月23日。

version

public class test3

class persion}

12樓:綱盼佛

在釋放物件佔用的記憶體之前,垃圾收集器會呼叫物件的finalize()方法。一般建議在該方法中釋放物件持有的資源。

為什麼在j**a中不使用finalize方法

13樓:瘋狂的果丹皮兒

object的中的方法finalize(),格式如下。

protected void finalize( )throws throwable

不能用的原因是它使用了修飾符protected,從下面可以看出protected在不同包內是不能用的,你可以在類中呼叫方法,但是例項化的物件是肯定不用想了。

作用域 當前類 同一package 子孫類 其他packagepublic √

protected √

friendly √

private √

j**a裡finalize()方法是幹什麼用的?

14樓:千鋒教育

類的finalize()方法,可以告訴垃圾**器應該執行的操作,該方法從object類繼承而來。

在從堆中永久刪除物件之前,垃圾**器呼叫該物件的finalize()方法。注意,無法確切地保證垃圾**器何時呼叫該方法,也無法保證呼叫不同物件的方法的順序。即使乙個物件包含另乙個物件的引用,或者在釋放乙個物件很久以前就釋放了另乙個物件,也可能會以任意的順序呼叫這兩個物件的finalize方法。

如果必須保證採用特定的順序,則必須提供自己的特有清理方法。

15樓:星雲花海

當垃圾**器認為乙個物件沒有存在意義時,會呼叫該物件的這個方法,釋放該物件在堆中佔用的記憶體。此方法繼承於始祖object。

用什麼方法快速記憶魔方F2L的全部情況和公式?

fl 剛開始學習fl的時候,可以先掌握個基本規律後,伏早敬自己研究fl的原理,結果每一種case可以用個基本規律中的方法解出 然後再逐漸把其他的個公式逐步全部記憶熟練,在記憶公式的過程中結合 的教程以及自己的手法特點,選擇自己當下階段最順手的公式強化練習。ps 因為缺慎fl觀察睜雀的地方非常多,剛開...

用C中物件導向的程式設計方法求不同圖形面積

include include define pi 3.14 using namespace std class shape shape這個類裡面過載了計算面積的函式 float shape getarea float side1,float side2,float side3 計算三角形面積 fl...

物件導向分析 《將進酒》中類及方法 10

物件導向分析 將進酒 中類及方法 將進酒 李白。君不見,黃河之水天上來,奔流到海不復回。君不見,高堂明鏡悲白髮,朝如青絲暮成雪。人生得意須盡歡,莫使金樽空對月。天生我材必有用,千金散盡還復來。烹羊宰牛且為樂,會須一飲三百杯。岑夫子,丹丘生,將進酒,君莫停。與君歌一曲,請君為我傾耳聽。鐘鼓饌 zhua...