熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

GC策略&內存申請、對象衰老

2022-06-13   來源: Java核心技術 

  

  JVM裡的GC(Garbage Collection)的算法有很多種如標記清除收集器壓縮收集器分代收集器等等詳見HotSpot VM GC 的種類

  現在比較常用的是分代收集(generational collection也是SUN VM使用的JSE之後引入)即將內存分為幾個區域將不同生命周期的對象放在不同區域裡:young generationtenured generation和permanet generation絕大部分的objec被分配在young generation(生命周期短)並且大部分的object在這裡die當young generation滿了之後將引發minor collection(YGC)在minor collection後存活的object會被移動到tenured generation(生命周期比較長)最後tenured generation滿之後觸發major collectionmajor collection(Full gc)會觸發整個heap的回收包括回收young generationpermanet generation區域比較穩定主要存放classloader信息

  young generation有eden個survivor 區域組成其中一個survivor區域一直是空的是eden區域和另一個survivor區域在下一次copy collection後活著的objecy的目的地object在survivo區域被復制直到轉移到tenured區

  我們要盡量減少 Full gc 的次數(tenured generation 一般比較大收集的時間較長頻繁的Full gc會導致應用的性能收到嚴重的影響)

  堆內存GC

  JVM(采用分代回收的策略)用較高的頻率對年輕的對象(young generation)進行YGC而對老對象(tenured generation)較少(tenured generation 滿了後才進行)進行Full GC這樣就不需要每次GC都將內存中所有對象都檢查一遍

  非堆內存不GC

  GC不會在主程序運行期對PermGen Space進行清理所以如果你的應用中有很多CLASS(特別是動態生成類當然permgen space存放的內容不僅限於類)的話就很可能出現PermGen Space錯誤

  內存申請對象衰老過程

  一內存申請過程

  &#;JVM會試圖為相關Java對象在Eden中初始化一塊內存區域

  &#;當Eden空間足夠時內存申請結束否則到下一步

  &#;JVM試圖釋放在Eden中所有不活躍的對象(minor collection)釋放後若Eden空間仍然不足以放入新對象則試圖將部分Eden中活躍對象放入Survivor區

  &#;Survivor區被用來作為Eden及old的中間交換區域當OLD區空間足夠時Survivor區的對象會被移到Old區否則會被保留在Survivor區

  &#;當old區空間不夠時JVM會在old區進行major collection

  &#;完全垃圾收集後若Survivor及old區仍然無法存放從Eden復制過來的部分對象導致JVM無法在Eden區為新對象創建內存區域則出現Out of memory錯誤

  二對象衰老過程

  &#;新創建的對象的內存都分配自edenMinor collection的過程就是將eden和在用survivor space中的活對象copy到空閒survivor space中對象在young generation裡經歷了一定次數(可以通過參數配置)的minor collection後就會被移到old generation中稱為tenuring

  &#;GC觸發條件

  GC類型 觸發條件 觸發時發生了什麼 注意 查看方式 YGC eden空間不足

  清空Eden+from survivor中所有no ref的對象占用的內存
將eden+from sur中所有存活的對象copy到to sur中
一些對象將晉升到old中:
to sur放不下的
存活次數超過turning threshold中的
重新計算tenuring threshold(serial parallel GC會觸發此項)

  重新調整Eden 和from的大小(parallel GC會觸發此項)

全過程暫停應用
是否為多線程處理由具體的GC決定 jstat –gcutil
gc log FGC

  old空間不足
perm空間不足
顯示調用SystemGC RMI等的定時觸發
YGC時的悲觀策略
dump live的內存信息時(jmap –dump:live)

清空heap中no ref的對象
permgen中已經被卸載的classloader中加載的class信息

如配置了CollectGenOFirst則先觸發YGC(針對serial GC)
如配置了ScavengeBeforeFullGC則先觸發YGC(針對serial GC)

  全過程暫停應用
是否為多線程處理由具體的GC決定

是否壓縮需要看配置的具體GC jstat –gcutil
gc log

  permanent generation空間不足會引發Full GC仍然不夠會引發PermGen Space錯誤


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26151.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.