JVM 垃圾回收原理
JVM 的垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,防止内存泄露。
GC 的垃圾回收判断算法
1、引用计数法
每个对象都有一个计数器,当有引用指向该对象时计数器加 1,当引用失效时计数器减 1。用对象计数器是否为 0 来判断对象是否可被回收。
2 可达性分析算法
通过 GC ROOT 的对象作为搜索起始点,向下搜索,路径被称为引用链。
通过判断对象是否有到达引用链的路径来决定对象是否可被回收
垃圾回收算法
1、标记-清除算法
先把内存区域中的这些对象进行标记,哪些属于可回收标记出来,然后把这些垃圾拎出来清理掉。
复制算法
复制算法是为了解决标记清除算法的内存碎片问题。它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
标记-整理算法
标记-整理算法标记过程仍然与标记-清除算法一样,但内存清理时不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,再清理掉端边界以外的内存区域。
分代收集算法
虚拟机将堆内存划分为新生代、老年战和永久代。
新生代(Young)
新生成的对象优先存放在新生代中,新生代对象朝生夕死,存活率很低
老年代(OldGenerationn)
在新生代中经历了多次(具体看虚拟机配置的阀值)GC 后仍然存活下来的对象会进入老年代中。老年代中的对象生命周期较长,存活率比较高,在老年代中进行 GC 的频率相对而言较低,而且回收的速度也比较慢。
永久代(PermanentGenerationn)
永久代存储类信息、常量、静态变量、即时编译器编译后的代码等数据,对这一区域而言,Java 虚拟机规范指出可以不进行垃圾收集,一般而言不会进行垃圾回收。
评论