JVM裏的GC(Garbage Collection)的算法有不少種,如標記清除收集器,壓縮收集器,分代收集器等等算法
如今比較經常使用的是分代收集(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區。spa
咱們要儘可能減小 Full gc 的次數(tenured generation 通常比較大,收集的時間較長,頻繁的Full gc會致使應用的性能收到嚴重的影響)。對象
###1、堆內存GC生命週期
JVM(採用分代回收的策略),用較高的頻率對年輕的對象(young generation)進行YGC,而對老對象(tenured generation)較少(tenured generation 滿了後才進行)進行Full GC。這樣就不須要每次GC都將內存中全部對象都檢查一遍。內存
###2、非堆內存不GCssl
GC不會在主程序運行期對PermGen Space進行清理,因此若是你的應用中有不少CLASS(特別是動態生成類,固然permgen space存放的內容不只限於類)的話,就極可能出現PermGen Space錯誤。io