Java背後的秘密之Java的垃圾收集器04

來源:互聯網
上載者:User

JVM垃圾收集機制:
Java語言在推出時或者說直到現在,有兩個最為令人信服的特性,即跨平台特性和自動記憶體回收。所謂自動記憶體回收,JVM能夠自動識別Java堆中無用的對象(垃圾),並且釋放它們所佔的空間,以便其他對象使用。垃圾收集機制把程式員從惱人的記憶體管理中解救了出來,使之騰出更多的精力去考慮其他程式的問題。這無疑相比在此之前的一些語言(如:C++),減輕了開發人員的工作負擔。JVM的記憶體回收由JVM的記憶體回收行程來實現,不同的JVM在這些方面會有些許的不同。另外記憶體回收行程除了進行記憶體回收外,還會對Java的堆空間片段進行壓縮,以便能夠更有效利用記憶體空間。
疑問:
1.垃圾收集機制真的解放了開發人員嗎?
回答:不一定,從某種程度來看,若想真的避免記憶體流失,還要看開發人員或設計人員的經驗與水平。

2.垃圾收集機制真的就是一勞永逸的解決問題的“銀彈”嗎?
回答:當然不是,如果使用不當反會被其所傷,對程式效能造成重大傷害。

3.怎麼辦呢?
回答:1.水平經驗的積累;2.折中思想的運用。

垃圾收集的實現:
(1)、引用計數:早期JDK版本採用;
優點:交織在程式運行之中運行較快;
缺點:由於計數從而帶來了額外開銷;不能識別循環參考;

(2)、跟蹤收集:
優點:可以識別循環參考,不會交織在程式運行過程中;
缺點:需要維護一張對象引用全景,增加了記憶體開銷,如果是一個複雜的引用,那麼遍曆這張全景的時候,效能開銷也會很大。

(3)、基於對象跟蹤的分代增量收集:當今大部分的虛擬機器產品,都使用這種收集技術。如:SUN的HotSpot(我們常用的),IBM的JVM產品,BEA的weblogic等。
優點:不同時期收集所有代,因此可以使垃圾收集時間更短;可以針對不同對象採用不同的收集演算法,從而充分利用系統資源。
缺點:收集演算法複雜,開銷巨大,這也是Java效能與記憶體使用量問題的主要來源之一。

具體實現,以SUN的HotSpot為例說明:
SUN的JVM將整個堆分為三代,即三個地區,如所見:

這個三代分別為Young(年輕代)、Tenured(年老代)、Perm(持久代)。
年輕代:對這個地區的GC是相對高效和快速的,這個地區中經曆了若干次GC仍然存活的對象,“晉陞”到年老代。

年老代:記憶體佔用較大的對象,即重量級對象,則一開始直接被分配到年老代。

持久代:這一代中存放長時間存活的對象,如Class對象基礎資料資訊、全域應用配置資訊等。

何時進行GC呢?
很簡單當然是在Heap不夠時,年輕代不夠就對年輕代做GC,年老代不夠就對年老代做GC,但是收集演算法都是不同的。注意年老代對象的回收(全收集)遠比年輕代對象的回收(會觸發一個小收集)耗時耗力,所以全收集對應用系統效能會造成極大傷害,因此要儘力避免。

轉載來源www.boobooke.com/bbs->J2EE專區->藍山作品—Java背後的秘密(匯總) 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.