一、垃圾确定方式
1.引用计数法: 每次对象被引用时,该对象的计数器都会+1,取消引用 计数器就会-1,当堆中的对象没有引用次数时就会被确定为垃圾,但是如果对象之间存在交叉引用时就无法被认为是垃圾
2.可达性分析法: 判断一个对象是否由从堆内到堆外的引用,没有则会被认为垃圾
二、垃圾回收算法
了解了垃圾的确定方法后,我们将继续了解垃圾是怎么被回收的,即垃圾回收算法。在Java中主要有四中垃圾回收算法,分别是标记清除算法、复制算法、标记整理算法 和 分代收集算法。
标记清除算法:当堆中的有效内存空间被耗尽的时候,就会暂停、挂起整个程序(也被称为stop the world),然后进行两项工作,第一项则是标记,第二项则是清除。
复制算法:将堆空间平均分为两份,在一份上存储,当这一块内存满后将其中存活的对象复制到另一块上去,然后把该内存中的垃圾对象清理掉
标记整理算法:结合了以上两个算法,为了避免缺陷而提出。标记阶段和标记清理算法相同,标记后不是清理对象,而是将存活对象移向内存的一端。然后清除端边界外的对象。
分代收集算法
在结合以上三种算法的综合分析及 JVM 内存对象生命周期的特点,诞生了一种新的垃圾回收算法——分代收集算法。其核心思想是根据对象存活的不同生命周期将内存划分为不同的域,一般情况下将 GC 堆划分为老年代。老年代的特点是每次垃圾回收时只有少量对象需要被回收,新生代的特点是每次垃圾回收时都有大量垃圾需要被回收,因此可以根据不同区域选择不同的算法。
三、垃圾回收器
1、串行垃圾回收器
串行:在一个线程内执行垃圾回收操作。
新生代串行回收器 SerialGC:采用复制算法实现,单线程垃圾回收,独占式垃圾回收器
老年代串行回收器 SerialOldGC:采用标记压缩算法,单线程独占式垃圾回收器
2、并行垃圾回收器
并行:在多个线程中执行垃圾回收操作。
新生代 ParNew 回收器:采用复制算法实现,多线程回收器,独占式垃圾回收器。
新生代 ParallelScavengeGC 回收器:采用复制算法多线程独占式回收器
老年代 ParallelOldGC 回收器: 采用标记压缩算法,多线程独占式回收器
3、并发垃圾回收器
并发:在一个线程中执行任务的同时检测垃圾并回收
CMS回收器:使用标记-清除算法的垃圾回收器。
G1回收器:标记-清除收集器的长期替代品。
标签:标记,对象,回收,算法,GC,垃圾,内存 From: https://blog.csdn.net/2401_82985792/article/details/143469760