JVM知识点——其余知识梳理

其余知识梳理

详解分代回收

前面提到过,java的堆内存被分代管理,分代管理主要是为了方便垃圾回收,这样作基于2个事实,第1、大部分对象很快就再也不使用,第二,还有一部分不会当即无用,但也不会持续很长时间。java

虚拟机中划分为年轻代、老年代、和永久代。算法

1>年轻代:主要用来存放新建立的对象,年轻代分为eden区和两个Survivor区。大部分对象在Eden区中生成。当Eden区满时,还存活的对象会在两个Survivor区交替保存,达到必定次数的对象会晋升到老年代。jvm

2>老年代:用来存放从年轻代晋升而来的,存活时间较长的对象。spa

3>永久代:主要保存类信息等内容,这里的永久代是指对象划分方式,不是专指1.7的permGen,或者1.8以后的metaspace。对象

根据年轻代与老年代的特色,jvm提供了不一样的垃圾回收算法。垃圾回收算法按类型能够分为引用计数法、复制法和标记清除法。内存

其中引用计数法是经过对象被引用的次数来肯定对象是否被使用,缺点是没法解决循环引用的问题。虚拟机

复制算法须要from和to两块相同大小的内存空间,对象分配时只在from块中进行,回收时把存活对象复制到to块中,并清空from块,而后交换两块的分工,即把from块做为to块,把to块做为from块。缺点是内存使用率较低。class

标记清除算法分为标记对象和清除不在使用的对象两个阶段,标记清除算法的缺点是会产生内存碎片。垃圾回收

jvm中提供的年轻代回收算法Serial、ParNew、Parallel Scavenge都是复制算法,而CMS、G一、zgc都属于标记清除算法。循环