自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解讀JVM對象生命周期之創(chuàng)建階段

開發(fā) 后端
你對JVM對象生命周期的概念是否了解,JVM對象生命周期大致可以分為七個階段,這里向大家描述一下第一個階段也就是創(chuàng)建階段,相信你一定會感興趣的。

本文向大家介紹一下JVM對象生命周期的概念,在JVM運行空間中,對象的整個生命周期大致可以分為7個階段:創(chuàng)建階段(Creation)、應(yīng)用階段(Using)、不可視階段(Invisible)、不可到達(dá)階段(Unreachable)、可收集階段(Collected)、終結(jié)階段(Finalized)與釋放階段(Free),這里簡單說一下創(chuàng)建階段。

詳細(xì)解讀JVM對象生命周期

JVM運行空間中,整個JVM對象生命周期大致可以分為7個階段:創(chuàng)建階段(Creation)、應(yīng)用階段(Using)、不可視階段(Invisible)、不可到達(dá)階段(Unreachable)、可收集階段(Collected)、終結(jié)階段(Finalized)與釋放階段(Free)。上面的這7個階段,構(gòu)成了JVM中對象的完整的生命周期。下面分別介紹對象在處于這7個階段時的不同情形。

創(chuàng)建階段

在對象創(chuàng)建階段,系統(tǒng)要通過下面的步驟,完成對象的創(chuàng)建過程:

(1)為對象分配存儲空間。

(2)開始構(gòu)造對象。

(3)遞歸調(diào)用其超類的構(gòu)造方法。

(4)進(jìn)行對象實例初始化與變量初始化。

(5)執(zhí)行構(gòu)造方法體。

上面的5個步驟中的第3步就是指遞歸地調(diào)用該類所擴(kuò)展的所有父類的構(gòu)造方法,一個Java類(除Object類外)至少有一個父類(Object),這個規(guī)則既是強(qiáng)制的,也是隱式的。你可能已經(jīng)注意到在創(chuàng)建一個Java類的時候,并沒有顯式地聲明擴(kuò)展(extends)一個Object父類。實際上,在Java程序設(shè)計中,任何一個Java類都直接或間接的是Object類的子類。例如下面的代碼: 

  1. publicclassA{  
  2. …  
  3. }  
  4. 這個聲明等同于下面的聲明:  
  5. publicclassAextendsjava.lang.Object{  
  6. …  

上面講解了對象處于創(chuàng)建階段時,系統(tǒng)所做的一些處理工作,其中有些過程與應(yīng)用的性能密切相關(guān),因此在創(chuàng)建對象時,我們應(yīng)該遵循一些基本的規(guī)則,以提高應(yīng)用的性能。

下面是JVM對象生命周期在創(chuàng)建對象時的幾個關(guān)鍵應(yīng)用規(guī)則:

(1)避免在循環(huán)體中創(chuàng)建對象,即使該對象占用內(nèi)存空間不大。

(2)盡量及時使對象符合垃圾回收標(biāo)準(zhǔn)。

(3)不要采用過深的繼承層次。

(4)訪問本地變量優(yōu)于訪問類中的變量。

關(guān)于規(guī)則(1)避免在循環(huán)體中創(chuàng)建對象,即使該對象占用內(nèi)存空間不大,需要提示一下,這種情況在我們的實際應(yīng)用中經(jīng)常遇到,而且我們很容易犯類似的錯誤,例如下面的代碼: 

  1. ……  
  2. for(inti=0;i<10000;++i){  
  3. Objectobj=newObject();  
  4. System.out.println("obj="+obj);  
  5. }  
  6. ……  

 上面代碼的書寫方式相信對你來說不會陌生,也許在以前的應(yīng)用開發(fā)中你也這樣做過,尤其是在枚舉一個Vector對象中的對象元素的操作中經(jīng)常會這樣書寫,但這卻違反了上述規(guī)則(1),因為這樣會浪費較大的內(nèi)存空間,正確的方法如下所示: 

  1. ……  
  2. Objectobj=null;  
  3. for(inti=0;i<10000;++i){  
  4. obj=newObject();  
  5. System.out.println("obj="+obj);  
  6. }  
  7. ……  

 采用上面的第二種編寫方式,僅在內(nèi)存中保存一份對該對象的引用,而不像上面的***種編寫方式中代碼會在內(nèi)存中產(chǎn)生大量的對象應(yīng)用,浪費大量的內(nèi)存空間,而且增大了系統(tǒng)做垃圾回收的負(fù)荷。因此在循環(huán)體中聲明創(chuàng)建對象的編寫方式應(yīng)該盡量避免。
另外,不要對一個對象進(jìn)行多次初始化,這同樣會帶來較大的內(nèi)存開銷,降低系統(tǒng)性能,如: 

  1. publicclassA{  
  2. privateHashtabletable=newHashtable();  
  3. publicA(){  
  4. //將Hashtable對象table初始化了兩次  
  5. table=newHashtable();  
  6. }  
  7. }  

 正確的方式為: 

  1. publicclassB{  
  2. privateHashtabletable=newHashtable();  
  3. publicB(){  
  4. }  

不要小看這個差別,它卻使應(yīng)用軟件的性能相差甚遠(yuǎn),如圖2-5所示。

初始化對象多次所帶來的性能差別

看來在程序設(shè)計中也應(yīng)該遵從“勿以惡小而為之”的古訓(xùn),否則我們開發(fā)出來的應(yīng)用也是低效的應(yīng)用,有時應(yīng)用軟件中的一個極小的失誤,就會大幅度地降低整個系統(tǒng)的性能。因此,我們在日常的應(yīng)用開發(fā)中,應(yīng)該認(rèn)真對待每一行代碼,采用***化的編寫方式,不要忽視細(xì)節(jié),不要忽視潛在的問題。本節(jié)關(guān)于JVM對象生命周期的***個階段就介紹到這里,請看下節(jié)有關(guān)其他階段的介紹。

【編輯推薦】

  1. JVM內(nèi)存溢出的兩大類型及解決方案
  2. Tomcat配置JVM參數(shù)巧妙方法
  3. JVM基礎(chǔ):解析JVM分代垃圾回收策略
  4. JVM for Linux JIT診斷技術(shù)簡介
  5. 巧解IBM JVM for Linux onPOWER性能調(diào)優(yōu)
責(zé)任編輯:佚名 來源: javaeye.com
相關(guān)推薦

2010-09-27 10:40:47

JVM對象生命周期

2009-03-04 10:18:50

生命周期JVMjava

2013-08-19 17:03:00

.Net生命周期對象

2010-01-15 13:52:44

VB.NET對象生命周

2009-06-17 15:06:50

Hibernate實體

2023-10-07 00:05:07

2011-07-07 14:22:27

Cocoa 對象 生命周期

2015-07-08 16:28:23

weak生命周期

2023-10-05 06:01:28

2022-08-02 08:00:00

機(jī)器學(xué)習(xí)數(shù)據(jù)框架

2009-06-24 10:47:55

JSF生命周期

2012-06-20 10:29:16

敏捷開發(fā)

2021-07-19 05:52:29

網(wǎng)絡(luò)生命周期網(wǎng)絡(luò)框架

2009-07-23 18:55:17

ASP.NET頁生命周

2022-04-19 07:20:24

軟件開發(fā)安全生命周期SSDLC應(yīng)用安全

2009-08-10 14:31:46

ASP.NET組件設(shè)計ASP.NET控件生命

2014-07-16 13:39:30

Windows Pho

2013-08-01 09:40:51

Windows 8.1

2009-06-18 13:32:39

Java線程生命周期

2012-04-28 13:23:12

Java生命周期
點贊
收藏

51CTO技術(shù)棧公眾號