其他知识梳理
详解分代回收
前面提到过,java的堆内存被分代管理,分代管理主要是为了方便垃圾回收,这样做基于2个事实,第一、大部分对象很快就不再使用,第二,还有一部分不会立即无用,但也不会持续很长时间。
虚拟机中划分为年轻代、老年代、和永久代。
1>年轻代:主要用来存放新创建的对象,年轻代分为eden区和两个Survivor区。大部分对象在Eden区中生成。当Eden区满时,还存活的对象会在两个Survivor区交替保存,达到一定次数的对象会晋升到老年代。
2>老年代:用来存放从年轻代晋升而来的,存活时间较长的对象。
3>永久代:主要保存类信息等内容,这里的永久代是指对象划分方式,不是专指1.7的permGen,或者1.8之后的metaspace。
根据年轻代与老年代的特点,jvm提供了不同的垃圾回收算法。垃圾回收算法按类型可以分为引用计数法、复制法和标记清除法。
其中引用计数法是通过对象被引用的次数来确定对象是否被使用,缺点是无法解决循环引用的问题。
复制算法需要from和to两块相同大小的内存空间,对象分配时只在from块中进行,回收时把存活对象复制到to块中,并清空from块,然后交换两块的分工,即把from块作为to块,把to块作为from块。缺点是内存使用率较低。
标记清除算法分为标记对象和清除不在使用的对象两个阶段,标记清除算法的缺点是会产生内存碎片。
jvm中提供的年轻代回收算法Serial、ParNew、Parallel Scavenge都是复制算法,而CMS、G1、zgc都属于标记清除算法。
网友评论