JVM對(duì)象的生命周期

一旦一個(gè)類被裝載吏垮、連接和初始化障涯,它就隨時(shí)可以被使用。程序可以訪問(wèn)它的靜態(tài)字段膳汪,調(diào)用它的靜態(tài)方法唯蝶,或者創(chuàng)建它的實(shí)例。作為Java程序員有必要了解Java對(duì)象的生命周期遗嗽。

類實(shí)例化

在Java程序中粘我,類可以被明確或隱含地實(shí)例化。明確的實(shí)例化類有四種途徑:

  • 明確調(diào)用new痹换。
  • 調(diào)用Class或者java.lang.reflect.Constructor對(duì)象的newInstance方法征字。
  • 調(diào)用任何現(xiàn)有對(duì)象的clone
  • 通過(guò)java.io.ObjectInputStream.getObject()反序列化娇豫。

隱含的實(shí)例化:

  • 可能是保存命令行參數(shù)的String對(duì)象匙姜。
  • 對(duì)于Java虛擬機(jī)裝載的每個(gè)類,都會(huì)暗中實(shí)例化一個(gè)Class對(duì)象來(lái)代表這個(gè)類型
  • 當(dāng)Java虛擬機(jī)裝載了在常量池中包含CONSTANT_String_info入口的類的時(shí)候冯痢,它會(huì)創(chuàng)建新的String對(duì)象來(lái)表示這些常量字符串氮昧。
  • 執(zhí)行包含字符串連接操作符的表達(dá)式會(huì)產(chǎn)生新的對(duì)象框杜。

Java編譯器為它編譯的每個(gè)類至少生成一個(gè)實(shí)例初始化方法。在Java class文件中袖肥,這個(gè)方法被稱為<init>咪辱。針對(duì)源代碼中每個(gè)類的構(gòu)造方法,Java編譯器都會(huì)產(chǎn)生一個(gè)<init>()方法椎组。如果累沒(méi)有明確的聲明任何構(gòu)造方法梧乘,編譯器會(huì)默認(rèn)產(chǎn)生一個(gè)無(wú)參數(shù)的構(gòu)造方法,它僅僅調(diào)用父類的無(wú)參構(gòu)造方法庐杨。

一個(gè)<init>()中可能包含三種代碼:調(diào)用另一個(gè)<init>()选调、實(shí)現(xiàn)對(duì)任何實(shí)例變量的初始化、構(gòu)造方法體的代碼灵份。

如果構(gòu)造方法明確的調(diào)用了同一個(gè)類中的另一個(gè)構(gòu)造方法(this())仁堪,那么它對(duì)應(yīng)的<init>()由兩部分組成:

  • 一個(gè)同類的<init>()的調(diào)用。
  • 實(shí)現(xiàn)了對(duì)應(yīng)構(gòu)造方法的方法體的字節(jié)碼填渠。

在它對(duì)應(yīng)的<init>()方法中不會(huì)有父類的<init>()弦聂,但不代表不會(huì)調(diào)用父類的<init>(),因?yàn)?code>this()中也會(huì)調(diào)用父類<init>()

如果構(gòu)造方法不是通過(guò)一個(gè)this()調(diào)用開(kāi)始的氛什,而且這個(gè)對(duì)象不是Object莺葫,<init>()則有三部分組成:

  • 一個(gè)父類的<init>()調(diào)用。如果這個(gè)類是Object,則沒(méi)有這個(gè)部分
  • 任意實(shí)例變量初始化方法的字節(jié)碼枪眉。
  • 實(shí)現(xiàn)了對(duì)應(yīng)構(gòu)造方法的方法體的字節(jié)碼捺檬。

如果構(gòu)造方法明確的調(diào)用父類的構(gòu)造方法super()開(kāi)始,它的<init>()會(huì)調(diào)用對(duì)應(yīng)父類的<init>()贸铜。比如堡纬,如果一個(gè)構(gòu)造方法明確的調(diào)用super(int,String)開(kāi)始,對(duì)應(yīng)的<init>()會(huì)從調(diào)用父類的<init>(int,String)方法開(kāi)始蒿秦。如果構(gòu)造方法沒(méi)有明確地從this()super()開(kāi)始烤镐,對(duì)應(yīng)的<init>()默認(rèn)會(huì)調(diào)用父類的無(wú)參<init>()

垃圾收集和對(duì)象的終結(jié)

程序可以明確或隱含的為對(duì)象分配內(nèi)存棍鳖,但不能明確的釋放內(nèi)存炮叶。一個(gè)對(duì)象不再為程序引用,虛擬機(jī)必須回事那部分內(nèi)存渡处。

卸載類

在很多方面镜悉,Java虛擬機(jī)中類的生命周期和對(duì)象的生命周期很相似。當(dāng)程序不再使用某個(gè)類的時(shí)候骂蓖,可以選擇卸載它們积瞒。

類的垃圾收集和卸載值所以在Java虛擬機(jī)中很重要,是因?yàn)镴ava程序可以在運(yùn)行時(shí)通過(guò)用戶自定義的類裝載器裝載類型來(lái)動(dòng)態(tài)的擴(kuò)展程序登下。所有被裝載的類型都在方法區(qū)占據(jù)內(nèi)存空間茫孔。

Java虛擬機(jī)通過(guò)判斷類是否在被引用來(lái)進(jìn)行垃圾收集叮喳。判斷動(dòng)態(tài)裝載的類的Class實(shí)例在正常的垃圾收集過(guò)程中是否可觸及有兩種方式:

  • 如果程序保持非Class實(shí)例的明確引用。
  • 如果在堆中還存在一個(gè)可觸及的對(duì)象缰贝,在方法區(qū)中它的類型數(shù)據(jù)指向一個(gè)Class實(shí)例馍悟。
touch-class-instance.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市剩晴,隨后出現(xiàn)的幾起案子锣咒,更是在濱河造成了極大的恐慌,老刑警劉巖赞弥,帶你破解...
    沈念sama閱讀 212,332評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毅整,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡绽左,警方通過(guò)查閱死者的電腦和手機(jī)悼嫉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拼窥,“玉大人戏蔑,你說(shuō)我怎么就攤上這事÷尘溃” “怎么了总棵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,812評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)改含。 經(jīng)常有香客問(wèn)我情龄,道長(zhǎng),這世上最難降的妖魔是什么候味? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,607評(píng)論 1 284
  • 正文 為了忘掉前任刃唤,我火速辦了婚禮,結(jié)果婚禮上白群,老公的妹妹穿的比我還像新娘。我一直安慰自己硬霍,他們只是感情好帜慢,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著唯卖,像睡著了一般粱玲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拜轨,一...
    開(kāi)封第一講書(shū)人閱讀 49,919評(píng)論 1 290
  • 那天抽减,我揣著相機(jī)與錄音,去河邊找鬼橄碾。 笑死卵沉,一個(gè)胖子當(dāng)著我的面吹牛颠锉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播史汗,決...
    沈念sama閱讀 39,071評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼琼掠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了停撞?” 一聲冷哼從身側(cè)響起瓷蛙,我...
    開(kāi)封第一講書(shū)人閱讀 37,802評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎戈毒,沒(méi)想到半個(gè)月后艰猬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,256評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埋市,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評(píng)論 2 327
  • 正文 我和宋清朗相戀三年姥宝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恐疲。...
    茶點(diǎn)故事閱讀 38,712評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腊满,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出培己,到底是詐尸還是另有隱情碳蛋,我是刑警寧澤,帶...
    沈念sama閱讀 34,389評(píng)論 4 332
  • 正文 年R本政府宣布省咨,位于F島的核電站肃弟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏零蓉。R本人自食惡果不足惜笤受,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望敌蜂。 院中可真熱鬧箩兽,春花似錦、人聲如沸章喉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秸脱。三九已至落包,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摊唇,已是汗流浹背咐蝇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巷查,地道東北人有序。 一個(gè)月前我還...
    沈念sama閱讀 46,473評(píng)論 2 360
  • 正文 我出身青樓抹腿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親笔呀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子幢踏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法许师,內(nèi)部類的語(yǔ)法房蝉,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法微渠,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,598評(píng)論 18 399
  • (一)Java部分 1搭幻、列舉出JAVA中6個(gè)比較常用的包【天威誠(chéng)信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,085評(píng)論 0 62
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)逞盆,斷路器檀蹋,智...
    卡卡羅2017閱讀 134,637評(píng)論 18 139
  • 堅(jiān)持早睡早起,早五點(diǎn)云芦,起來(lái)后運(yùn)動(dòng)俯逾,冥想、或跑步舅逸。 6.6帶領(lǐng)天使班同學(xué)一起5km(?????)桌肴,生活儀式感不可缺。...
    金勇Maya閱讀 180評(píng)論 0 1
  • 這兩天比較忙琉历,導(dǎo)致原本閱讀本身比較慢的我坠七,閱讀的量更趕不上之前的要求了,今天晚上回到家旗笔,無(wú)意間在一家公眾號(hào)文章里彪置,...
    yanzi123閱讀 130評(píng)論 0 0