java虛擬機器之垃圾收集器與記憶體配置策略

來源:互聯網
上載者:User

標籤:java記憶體   虛擬   ade   hotspot   png   1.2   出棧   分享   分支   

  哪些記憶體需要回收?

    java記憶體運行時地區的各個部分,其中程式計數器,虛擬機器棧,本地方法棧3個地區隨線程而生,隨線程而滅,棧中的棧幀隨著方法的進入和退出而有條不絮的執行著出棧和入棧操作。每一個棧幀中分配多少記憶體基本上是在類結構確定下來時就已知的。因此這幾個地區的記憶體配置和回收都具有確定性,所以這部分不需要過多考慮記憶體回收。但是方法區和堆不一樣,一個介面中的多個實作類別需要的記憶體可能不一樣,一個方法中的多個分支需要的記憶體也不一樣,我們只有在程式處於運行期間才能知道會建立哪些對象,這部分的分配和回收都是動態,垃圾收集器所關注的就是這部分記憶體。

  對象對用:

    引用:在jdk1.2之後,引用分為 強引用,軟引用,弱引用,虛引用:

      強引用:在程式中普遍存在的,如Object obj=new Object();   這類的引用,只要強引用還在,垃圾收集器永遠不會回收掉被引用的對象。

      軟引用:用來描述一些有用但非必須的對象。在系統將要發生記憶體溢出異常之前,將會把這些對象列進回收範圍之中進行第二次回收。 提供了SoftReference類來實現軟引用。

      弱引用:用來描述非必需對象,但是它的強度比軟引用更弱一些,被弱引用關聯的對象只能生存到下一次垃圾收集發生之前。當垃圾收集器工作時,無論當前記憶體是否足夠,都會回收掉只被弱引用關聯的對象。

      虛引用:最弱的參考關聯性,一個對象是否有虛引用的存在,完全不會對其存留時間構成影響,也無法通過虛引用來取的一個對象執行個體。為一個對象設定虛引用關聯的唯一目的就是能在這個對象被收集器回收時受到一個系統通知。 提供了PhantomReference類來實現虛引用。

  

  回收方法區:

    很多人認為方法區(hotspot稱永久代)不需要垃圾收集,而且java虛擬機器規範中確實說過可以不要求虛擬機器在方法區實現垃圾收集,而且在方法區中進行垃圾收集的性價比一般比較低。

    記憶體回收主要回收兩部分:廢棄常量和無用的類。

    回收廢棄常量和回收java堆中的對象很相似,如“abc”已經進入常量池,但是系統中沒有任何一個String對象叫做“abc”,沒有地方引用常量池中的“abc”,這個“abc”就會被清理。常量池中的其他類(介面)、方法、欄位的符號引用也類似。

    回收無用的類:類需要同時滿足下面3個條件才能算是無用的類(無用的類可以被回收)(在大量使用反射,動態代理,動態產生jsp,頻繁定義ClassLoader的情境都需要虛擬機器具備類卸載功能,以保證永久代不會溢出):

      1、該類所有的執行個體都已經被回收

      2、載入該類的ClassLoader已經被回收

      3、載入對應的java.lang.Class對象沒有任何地方被引用,無法在任何地方通過反射訪問該類的方法。

 

  垃圾收集演算法:

    1、標記-清除演算法

      首先需要標記所有需要回收的對象,在標記完成後統一回收所有被標記的對象。標記過程一般採用可達性分析演算法,而不是引用計數演算法。  它主要有兩點不足:1是效率問題,標記和清除兩個過程的效率都不高;另一個是空間問題,標記清除之後會產生大量不連續的記憶體片段,記憶體片段太多可能會導致以後在程式運行時需要分配

    

    

    2、複製演算法(解決效率問題)

      複製演算法將可用記憶體按容量劃分為大小相等的兩塊,每次只使用其中一塊,當這一塊的記憶體用完了,就將還存活的對象複製到另外一塊上面,然後再把已使用過的記憶體空間一次清理掉。這樣使得每次都是整個半區進行記憶體回收,記憶體配置時也就不用考慮記憶體片段等複雜情況。

      IBM公司研究,新生代中的對象98%是朝生夕死,不需要1:1劃分記憶體空間,而將記憶體分為一塊較大的Eden空間和兩塊較小的Survivor空間。每次使用Eden和其中一塊Survivor。當回收時,將Eden和Survivor中還存活著的對象一次性地複製到另外一塊Survivor空間上,最後清理掉Eden和使用過的Survivor空間。而HotSpot虛擬機器預設Eden和Survivor的大小比例是8:1:1,我們沒有辦法保證每次回收都只有不多於10%的對象存活,當Survivor空間不夠時,需要依賴其他記憶體進行分配擔保。

    

 

      

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.