欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

JVM垃圾回收機(jī)制總結(jié)(6) :透視Java的GC特性

系統(tǒng) 2103 0

全文轉(zhuǎn)載: http://topic.csdn.net/u/20091211/12/c79a9293-fdd5-4f81-b18f-a4a29c8d9be2.html ?
作者: yang677888 (from CSDN) ?
?
?
1、 ? 使用 System.gc() 可以不管JVM使用的是哪一種垃圾回收的算法,都可以請求 Java的垃圾回收。 ? 在命令行中有一個(gè)參數(shù)-verbosegc可以查看Java使用的堆內(nèi)存的情況,它的格式:java -verbosegc classfile

Java代碼 ? ? 收藏代碼
  1. class ?TestGC?{??????
  2. ????? ? public ? static ? void ?main(String[]?args)?{??????
  3. ????? ??  new ?TestGC();??????
  4. ?????  ??System.gc();??????
  5. ?????  ??System.runFinalization();??????
  6. ???????}??????
  7. ????}???????
  8. ???
  9. ??
  10. ???? class ?TestGC?{????
  11. ???? ? public ? static ? void ?main(String[]?args)?{????
  12. ????   new ?TestGC();????
  13. ????  ?System.gc();????
  14. ????  System.runFinalization();????
  15. ???? }????
  16. }??????

?在這個(gè)例子 中,一個(gè)新的對象被創(chuàng)建,由于它沒有使用,所以該對象迅速地變?yōu)榭蛇_(dá),程序編譯后,執(zhí)行命令: java -verbosegc TestGC 后結(jié)果為:

[Full GC 168K->97K(1984K), 0.0253873 secs]

  機(jī)器的環(huán) 境為,Windows 2000 + JDK1.3.1,箭頭前后的數(shù)據(jù)168K和97K分別表示垃圾收集GC前后所有存活對象使用的內(nèi)存容量,說明有168K-97K=71K的對象容量被回 收,括號內(nèi)的數(shù)據(jù)1984K為堆內(nèi)存的總?cè)萘浚占枰臅r(shí)間是0.0253873秒(這個(gè)時(shí)間在每次執(zhí)行的時(shí)候會(huì)有所不同)。

?

?

?2、 finalize方法 透視垃圾收集器的運(yùn)行 ?

  在JVM垃圾收集器收集一個(gè)對象之前 ,一般要求程序調(diào)用適當(dāng)?shù)姆椒ㄡ尫刨Y源,但在沒有明確釋放資源的情況下,Java提供了缺省機(jī)制來終止化該對象心釋放資源,這個(gè)方法就是 finalize()。它的原型為:
Java代碼 ?
1.?? ?protected void finalize() throws Throwable?? ?
 ?? 在finalize()方法返回之后,對象消失,垃圾收集開始執(zhí)行。原型中的throws Throwable表示它可以拋出任何類型的異常。

 ?? 之所以要使用finalize(),是由于有時(shí)需要采取與Java的普通方法不同的一種方法,通過分配內(nèi)存來做一些具有C風(fēng)格的事情。這主要可以通過" 固有方法"來進(jìn)行,它是從Java里調(diào)用非Java方法的一種方式。C和C++是目前唯一獲得固有方法支持的語言。但由于它們能調(diào)用通過其他語言編寫的子 程序,所以能夠有效地調(diào)用任何東西。在非Java代碼內(nèi)部,也許能調(diào)用C的malloc()系列函數(shù),用它分配存儲(chǔ)空間。而且除非調(diào)用了free(),否 則存儲(chǔ)空間不會(huì)得到釋放,從而造成內(nèi)存"漏洞"的出現(xiàn)。當(dāng)然,free()是一個(gè)C和C++函數(shù),所以我們需要在finalize()內(nèi)部的一個(gè)固有方法 中調(diào)用它。也就是說我們不能過多地使用finalize(),它并不是進(jìn)行普通清除工作的理想場所。

   在普通的清除工作中,為清除一個(gè) 對象,那個(gè)對象的用戶必須在希望進(jìn)行清除的地點(diǎn)調(diào)用一個(gè)清除方法。這與C++"破壞器"的概念稍有抵觸。在C++中,所有對象都會(huì)破壞(清除)。或者換句 話說,所有對象都"應(yīng)該"破壞。若將C++對象創(chuàng)建成一個(gè)本地對象,比如在堆棧中創(chuàng)建(在Java中是不可能的),那么清除或破壞工作就會(huì)在"結(jié)束花括 號"所代表的、創(chuàng)建這個(gè)對象的作用域的末尾進(jìn)行。若對象是用new創(chuàng)建的(類似于Java),那么當(dāng)程序員調(diào)用C++的delete命令時(shí)(Java沒有 這個(gè)命令),就會(huì)調(diào)用相應(yīng)的破壞器。若程序員忘記了,那么永遠(yuǎn)不會(huì)調(diào)用破壞器,我們最終得到的將是一個(gè)內(nèi)存"漏洞",另外還包括對象的其他部分永遠(yuǎn)不會(huì)得 到清除。

  相反,Java不允許我們創(chuàng)建本地(局部)對象--無論如何都要使用new。但在Java中,沒有"delete"命令來釋 放對象,因?yàn)槔占鲿?huì)幫助我們自動(dòng)釋放存儲(chǔ)空間。所以如果站在比較簡化的立場,我們可以說正是由于存在垃圾收集機(jī)制,所以Java沒有破壞器。然而, 隨著以后學(xué)習(xí)的深入,就會(huì)知道垃圾收集器的存在并不能完全消除對破壞器的需要,或者說不能消除對破壞器代表的那種機(jī)制的需要(而且絕對不能直接調(diào)用 finalize(),所以應(yīng)盡量避免用它)。若希望執(zhí)行除釋放存儲(chǔ)空間之外的其他某種形式的清除工作,仍然必須調(diào)用Java中的一個(gè)方法。它等價(jià)于 C++的破壞器,只是沒后者方便。

  下面這個(gè)例子向大家展示了垃圾收集所經(jīng)歷的過程,并對前面的陳述進(jìn)行了總結(jié)。

Java代碼 ? ? 收藏代碼
  1. package ?hr.test;????
  2. ????????
  3. import ?java.util.Calendar;????
  4. ????????
  5. ????? class ?Chair?{????
  6. ???????? static ? int ?created?=? 0 ;? //對象創(chuàng)建計(jì)數(shù)?? ??
  7. ???????? static ? int ?finalized?=? 0 ;? //對象回收計(jì)數(shù)?? ??
  8. ???????? //構(gòu)造器?? ??
  9. ????????Chair(){????
  10. ????????????created++;????
  11. ????????????System.err.println( "created?" +created+ "【" +Calendar.getInstance().get(Calendar.MINUTE)+ "m?" +Calendar.getInstance().get(Calendar.SECOND)+ "s】" );????
  12. ????????}????
  13. ???????? //垃圾回收析構(gòu)函數(shù)?? ??
  14. ???????? protected ? void ?finalize()?{????
  15. ????????????finalized++;????
  16. ????????????System.out.println( "finalize?" +finalized+ "【" +Calendar.getInstance().get(Calendar.MINUTE)+ "m?" +Calendar.getInstance().get(Calendar.SECOND)+ "s】" );????
  17. ????????}????
  18. ????}????
  19. ????????
  20. ???? public ? class ?Garbage?{????
  21. ???????? public ? static ? void ?main(String[]?args)?{????
  22. ???????????? while (Chair.created!= 10000 )?{????
  23. ???????????????? new ?Chair(); //創(chuàng)建對象?? ??
  24. ????????????}????
  25. ???????????? while ( true ){????
  26. ???????????????? if (Chair.created== 10000 ){????
  27. ???????????????????? break ;????
  28. ????????????????}????
  29. ????????????}????
  30. ????????}????
  31. ????}??????

?  上面這個(gè)程序創(chuàng)建了10000個(gè)Chair對象。但是在運(yùn)行結(jié)果中發(fā)現(xiàn),在累計(jì)循環(huán)創(chuàng)建到x個(gè)對象的時(shí)候,我們發(fā)現(xiàn)主線程被掛起,JVM開始運(yùn)行垃圾 回收程序。證據(jù)就是屏幕上開始打印出"final ..."。而且主線程被掛起的時(shí)間是不定的,有的時(shí)候我們甚至能在輸出中看到半條"create.. "就開始打印"final ..."了。

  經(jīng)過上述的說明,可以發(fā)現(xiàn)垃圾回收有以下的幾個(gè)特點(diǎn): ?

(1) 垃圾收集發(fā)生的不可預(yù) 知性: ? 由于實(shí)現(xiàn)了不同的垃圾收集算法和采用了不同的收集機(jī)制,所以它有可能是定時(shí)發(fā)生,有可能是當(dāng)出現(xiàn)系統(tǒng)空閑CPU資源時(shí)發(fā)生,也有可能是和原始的垃圾 收集一樣,等到內(nèi)存消耗出現(xiàn)極限時(shí)發(fā)生,這與垃圾收集器的選擇和具體的設(shè)置都有關(guān)系。 ?

(2)垃圾收集的精確性: ? 主要包括2 個(gè)方面:(a)垃圾收集器能夠精確標(biāo)記活著的對象; (b)垃圾收集器能夠精確地定位對象之間的引用關(guān)系。 前者是完全地回收所有廢棄對象的前提,否則就可能 造成內(nèi)存泄漏。而后者則是實(shí)現(xiàn)歸并和復(fù)制等算法的必要條件。所有不可達(dá)對象都能夠可靠地得到回收,所有對象都能夠重新分配,允許對象的復(fù)制和對象內(nèi)存的縮 并,這樣就有效地防止內(nèi)存的支離破碎。 ?

(3)現(xiàn)在有許多種不同的垃圾收集器,每種有其算法且其表現(xiàn)各異,既有當(dāng)垃圾收集開始時(shí)就 停止應(yīng)用程序的運(yùn)行,又有當(dāng)垃圾收集開始時(shí)也允許應(yīng)用程序的線程運(yùn)行,還有在同一時(shí)間垃圾收集多線程運(yùn)行。 ? ?

(4)垃圾收集的實(shí)現(xiàn) 和具體的JVM 以及JVM的內(nèi)存模型有非常緊密的關(guān)系。 ? 不同的JVM 可能采用不同的垃圾收集,而JVM 的內(nèi)存模型決定著該JVM可以采用哪些類型垃圾收集。現(xiàn)在,HotSpot 系列JVM中的內(nèi)存系統(tǒng)都采用先進(jìn)的面向?qū)ο蟮目蚣茉O(shè)計(jì),這使得該系列JVM都可以采用最先進(jìn)的垃圾收集。 ?

(5)隨著技術(shù)的發(fā) 展,現(xiàn)代垃圾收集技術(shù)提供許多可選的垃圾收集器,而且在配置每種收集器的時(shí)候又可以設(shè)置不同的參數(shù),這就使得根據(jù)不同的應(yīng)用環(huán)境獲得最優(yōu)的應(yīng)用性能成為可能。 ? ?

  針對以上特點(diǎn),我們在使用的時(shí)候要注意: ?

 (1)不要試圖去假定垃圾收集發(fā)生的時(shí)間,這一切都是未知 的。 ? 比如,方法中的一個(gè)臨時(shí)對象在方法調(diào)用完畢后就變成了無用對象,這個(gè)時(shí)候它的內(nèi)存就可以被釋放。 ?

  (2)Java中提供了一些 和垃圾收集打交道的類,而且提供了一種強(qiáng)行執(zhí)行垃圾收集的方法--調(diào)用System.gc(),但這同樣是個(gè)不確定的方法。 Java 中并不保證每次調(diào)用該方法就一定能夠啟動(dòng)垃圾收集,它只不過會(huì)向JVM發(fā)出這樣一個(gè)申請,到底是否真正執(zhí)行垃圾收集,一切都是個(gè)未知數(shù)。 ?

?  (3)挑選適合自己的垃圾收集器。 一般來說,如果系統(tǒng)沒有特殊和苛刻的性能要求,可以采用JVM的缺省選項(xiàng)。 ? 否則可以考慮使用有針對性的垃圾收集器,比 如增量收集器就比較適合實(shí)時(shí)性要求較高的系統(tǒng)之中。系統(tǒng)具有較高的配置,有比較多的閑置資源,可以考慮使用并行標(biāo)記/清除收集器。 ?

(4)關(guān)鍵的也是難把握的問題是內(nèi)存泄漏。 ? 良好的編程習(xí)慣和嚴(yán)謹(jǐn)?shù)木幊虘B(tài)度永遠(yuǎn)是最重要的,不要讓自己的一個(gè)小錯(cuò)誤導(dǎo)致內(nèi)存出現(xiàn)大漏洞。 ?

(5)盡早釋放無用對象的引用。 ? 大多數(shù)程序員在使用臨時(shí)變量的時(shí)候,都是讓引用變量在退出活動(dòng)域(scope)后,自動(dòng)設(shè)置為null,暗示垃圾收集器 來收集該對象,還必須注意該引用的對象是否被監(jiān)聽,如果有,則要去掉監(jiān)聽器,然后再賦空值。 ?

  結(jié)束語 ?

  一般 來說,Java開發(fā)人員可以不重視JVM中堆內(nèi)存的分配和垃圾處理收集,但是,充分理解Java的這一特性可以讓我們更有效地利用資源。同時(shí)要注意 finalize()方法是Java的缺省機(jī)制,有時(shí)為確保對象資源的明確釋放,可以編寫自己的finalize方法。

JVM垃圾回收機(jī)制總結(jié)(6) :透視Java的GC特性


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 超碰成人免费 | 亚洲欧美中文日韩在线v日本 | 亚洲欧美中文字幕 | www香蕉视频 | 午夜精品视频在线观看 | 色天天天天综合男人的天堂 | 另类国产ts人妖高潮系列视频 | 99精品国产免费观看视频 | 亚洲精品一区二区 | 日韩色中色 | 欧美激情一区二区亚洲专区 | 日本小网站 | 青娱乐激情视频 | 成人免费无毒在线观看网站 | 午夜丰满少妇高清毛片1000部 | 亚洲精品欧美视频 | 一级毛片国产真人永久在线 | 精品久久久久久久 | 免费午夜影片在线观看影院 | 欧美日韩不卡 | 欧美精品国产精品 | 日韩成人免费视频播放 | 久草热在线视频 | 泰国一级毛片aaa下面毛多 | 国产在线视频一区二区 | 日韩欧美视频一区二区三区 | 毛片毛片毛片毛片毛片毛片毛片 | 亚洲国产日产韩国欧美综合 | 一级黄色片网站 | 日本黄色一级片视频 | 国产午夜三级一区二区三桃花影视 | 久草在线中文888 | 亚洲自拍色 | 日本在线看| 天天天天射 | 草草在线免费视频 | 九九精品视频一区在线 | 欧美在线观看一区 | 日本无卡码免费一区二区三区 | 91免费在线看 | 成人永久在线 |