Java記憶體回收(二) 堆記憶體的分代回收

來源:互聯網
上載者:User

標籤:記憶體回收   java   分代回收   java記憶體回收   堆記憶體   

堆記憶體的分代回收

    Java針對堆的記憶體回收,將堆分為了三個較小的部分:新生代、老年代、持久代。新生代主要使用複製和標記-清除記憶體回收演算法,年老代主要使用標記-整理記憶體回收演算法,因此java虛擬中針對新生代和年老代分別提供了多種不同的垃圾收集器。

1. 分代回收的依據:
  • 對象存留時間長短:大部分對象在Young期間就被回收。
  • 不同代採用不同的記憶體回收策略:對存活時間不同的對象分類,用不同的記憶體回收演算法進行高效的有針對回收。
2. 堆記憶體的分代:
  • Young代

  •     回收機制:因為對象數量少,所以採用複製(stop-and-copy)回收。
  •     組成地區:由1個Eden區和2個Survivor區構成,同一時間的兩個Survivor區,一個用來儲存對象,另外一個是空的;絕大部分新產生的對象都放在Eden區,當Eden區將滿,JVM會因申請不到記憶體,而觸發Young GC ,進行Young代記憶體回收,就把Survivor的from區中可達對象複製到To區中,再清除Eden、From區,From區和To區互換,以便執行下一次的記憶體回收。一些存留時間長的對象直接分配到Old代中(關於存留時間長短,每次Young GC都會使Survivor區存活對象值+1,直到閾值)。
  •     對象來源:絕大多數對象先分配到Eden區,一些大的對象會直接被分配到Old代中。
  •     回收頻率:因為Young代中大部分對象很快的進入不可達狀態,因此回收頻率高且回收速度快。

  • Old 代:

  •     回收機制:採用標記壓縮演算法回收。(Concurrent-Mark–Sweep)
  •     對象來源:較大型的對象會直接進入Old代,另外再Young中生存的時間很長的可達對象也會進入Old代。
  •     回收頻率:因為很少對象會死掉,所以頻率不高,而且每次回收的時間很長,因為存在較多的大的對象。發生一次 Major GC 至少伴隨一次Young GC,一般比Young GC慢十倍以上。

  • Permanent代:

  •     用途:用來裝載Class,方法等資訊,預設為64M,不會被回收。
  •     對象來源:eg:動態產生類的時候,會不停的動態載入class檔案,但是這些佔用的記憶體不會被回收,不停的載入會讓Permanent代的記憶體耗盡,會出現OOM的現象。
  • 回收頻率:不會被回收。

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.