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