JVM系列二:GC策略内存申请、对象衰老
?????? JVM里的GC(Garbage Collection)的算法有很多種,如標記清除收集器,壓縮收集器,分代收集器等等,詳見HotSpot VM GC 的種類
?????? 現在比較常用的是分代收集(generational collection,也是SUN VM使用的,J2SE1.2之后引入),即將內存分為幾個區域,將不同生命周期的對象放在不同區域里:young generation,tenured generation和permanet generation。絕大部分的objec被分配在young generation(生命周期短),并且大部分的object在這里die。當young generation滿了之后,將引發minor collection(YGC)。在minor collection后存活的object會被移動到tenured generation(生命周期比較長)。最后,tenured generation滿之后觸發major collection。major collection(Full gc)會觸發整個heap的回收,包括回收young generation。permanet generation區域比較穩定,主要存放classloader信息。
?????? young generation有eden、2個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錯誤。
內存申請、對象衰老過程
一、內存申請過程
二、對象衰老過程
| GC類型 | 觸發條件 | 觸發時發生了什么 | 注意 | 查看方式 |
| YGC | eden空間不足 | 清空Eden+from survivor中所有no ref的對象占用的內存 重新調整Eden 和from的大小(parallel GC會觸發此項) | 全過程暫停應用 是否為多線程處理由具體的GC決定 | jstat –gcutil gc log |
| FGC | old空間不足 | 清空heap中no ref的對象 permgen中已經被卸載的classloader中加載的class信息 如配置了CollectGenOFirst,則先觸發YGC(針對serial GC) 如配置了ScavengeBeforeFullGC,則先觸發YGC(針對serial GC) | 全過程暫停應用 是否為多線程處理由具體的GC決定 是否壓縮需要看配置的具體GC | jstat –gcutil gc log |
參考:
http://jiangyongyuan.javaeye.com/blog/356502
http://www.helloying.com/blog/archives/164
?
相關內容推薦:
GC悲觀策略之Parallel GC篇
GC悲觀策略之Serial GC篇
轉載于:https://www.cnblogs.com/redcreen/archive/2011/05/04/2037056.html
總結
以上是生活随笔為你收集整理的JVM系列二:GC策略内存申请、对象衰老的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阳澄湖(说一说阳澄湖的简介)
- 下一篇: 怎么搭配衣服的技巧(怎么搭配衣服)