Java垃圾回收算法(GC)

一、垃圾回收算法

1、引用计数法(文中已经介绍,主要的缺点是无法处理循环引用;在每次引用的产生和消除的时候,会伴随着一个加法或者减法的操作,对性能有一定的影响)

2、标记清除法(从根节点出发开始所有可达的对象,未被标记的就是垃圾对象。主要缺点是产生空间碎片)

3、复制算法(将原空间分为两块,每次使用其中一块,在垃圾回收时,进行复制,然后转换使用的内存空间。主要的缺点是将系统的内存折半。主要适用于存活对象少,垃圾对象多的情况下)

4、标记压缩法(从根出发对所有可达对象进行一次标记,然后进行压缩。最后进行清理)

5、分代算法(每一种垃圾回收算法都有其优缺点。分代算法是根据对象的特点分成几块,新建的对象放入新生代区域,当一个对象经历了几次复制后还存活则放入老年代。老年代因为对象存活率高复制算法不适用,因此采取标记清除或者标记压缩)

6、分区算法(把堆空间划分为连续的不同小区间。降低了GC产生的影响)


二、堆空间分区(以下是摘自精品留言总结)

1:二八法则-适用于许多的领域,对象在JVM对内存空间的生命周期也同样符合

2:为了更好的JVM性能以及充分利用对象生命周期的二八法则,JVM的作者将JVM的对内存空间进行了分代的处理

3:堆内存空间=年轻代+老年代

年轻代=Eden+from+to
年轻代用于分配新生的对象
Eden-通常用于存储新创建的对象,对内存空间是共享的,所以,直接在这里面划分空间需要进行同步
from-当Eden区的空间耗尽时,JVM便会出发一次Minor GC 来收集新生代的垃圾,会把存活下来的对象放入Survivor区,也就是from区
注意,from和to是变动的
to-指向的Survivor区是空的,用于当发生Minor GC 时,存储Eden和from区中的存活对象,然后再交换from和to指针,以保证下一次Minor GC 时to指向的Survivor区还是空的。

老年代-用于存储存活时间更久的对象,比如:15次Minor GC 还存活的对象就放入老年代中

4:堆内存分代后,会根据他们的不同特点来区别对待,进行垃圾回收的时候会使用不同的垃圾回收方式,针对新生代的垃圾回收器有如下三个:Serial、Parallel Scavenge、Parallel New,他们采用的都是标记-复制的垃圾回收算法。
针对老年代的垃圾回收器有如下三个:Serial Old 、Parallel Old 、CMS,他们使用的都是标记-压缩的垃圾回收算法。

5:TLAB(Thread Local Allocation Buffer)-这个技术是用于解决多线程竞争堆内存分配问题的,核心原理是对分配一些连续的内存空间

6:卡表-这个技术是用于解决减少老年代的全堆空间扫描

猜你喜欢

转载自blog.csdn.net/qq_29269907/article/details/82964911