第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

當(dāng)java仍然在范圍內(nèi)時(shí),java能否最終確定它?

當(dāng)java仍然在范圍內(nèi)時(shí),java能否最終確定它?

當(dāng)java仍然在范圍內(nèi)時(shí),java能否最終確定它?我一直在研究我的代碼中的一個(gè)錯(cuò)誤,似乎是由一些“丑陋的”終結(jié)器代碼引起的。代碼看起來大致如此public class A {    public B b = new B();    @Override public void finalize() {      b.close();    }}public class B {    public void close() { /* do clean up our resources. */ }    public void doSomething() { /* do something that requires us not to be closed */ } }void main() {    A a = new A();    B b = a.b;    for(/*lots of time*/) {      b.doSomething();    }}我認(rèn)為正在發(fā)生的事情是a在第二行之后被檢測(cè)到?jīng)]有引用main()并且被終結(jié)器線程獲得GC并最終確定 - 當(dāng)for循環(huán)仍然發(fā)生時(shí),使用bwhile a仍然是“在范圍內(nèi)”。這有可能嗎?是否允許java在對(duì)象超出范圍之前將其作為對(duì)象?注意:我知道在終結(jié)器中做任何事情都很糟糕。這是我繼承并打算修復(fù)的代碼 - 問題是我是否正確理解了根本問題。如果這是不可能的,那么更微妙的東西必定是我的bug的根源。
查看完整描述

2 回答

?
阿晨1998

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊

JLS§12.6.1

可以設(shè)計(jì)優(yōu)化程序的轉(zhuǎn)換,以減少可達(dá)到的對(duì)象的數(shù)量,使其少于可以被認(rèn)為可達(dá)的對(duì)象的數(shù)量。例如,Java編譯器或代碼生成器可以選擇設(shè)置將不再用于null的變量或參數(shù),以使得此類對(duì)象的存儲(chǔ)可能更快地被回收。

所以,是的,我認(rèn)為這是允許的編譯器添加隱藏代碼設(shè)置anull,從而使其能夠進(jìn)行垃圾回收。如果發(fā)生了這種情況,您可能無法從字節(jié)碼中分辨出來(請(qǐng)參閱@ user2357112的評(píng)論)。

可能(丑陋)的解決方法:添加public static boolean alwaysFalse = false;到主類或其他類,然后在最后main()添加if (alwaysFalse) System.out.println(a);或引用的其他內(nèi)容a。我不認(rèn)為優(yōu)化器可以確定alwaysFalse永遠(yuǎn)不會(huì)設(shè)置(因?yàn)槟承╊惪偸强梢允褂梅瓷鋪碓O(shè)置它); 因此,它無法分辨出a不再需要它。至少,這種“解決方法”可用于確定這是否確實(shí)是問題。


查看完整回答
反對(duì) 回復(fù) 2019-08-13
  • 2 回答
  • 0 關(guān)注
  • 1487 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)