二、垃圾回收算法与思想

简介: 主要的垃圾回收算法一、引用计数器引用计数器实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1。当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0。则对象A就不可能再被使用了。只要为每个对象配备一个整型的计数器即可。但是计数器有个一个严重的问题,即无法处理循环引用的情况。因此在java的垃圾回收器中,没有使用这个算法。

主要的垃圾回收算法

一、引用计数器

引用计数器实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1。当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0。则对象A就不可能再被使用了。只要为每个对象配备一个整型的计数器即可。但是计数器有个一个严重的问题,即无法处理循环引用的情况。因此在java的垃圾回收器中,没有使用这个算法。

二、标记-清除算法

标记-清除算法是现代垃圾回收算法的思想基础。标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。标记阶段,标记出所有需要回收的对象,在标记完成后,统一回收所有被标记的对象。后续的算法都是基于这种思路并对其不足进行改进的。它的主要缺点有两个:1、一个是效率问题,标记和清除两个过程的效率都不高。2、另一个是空间问题,标记清除后,空间是不连续,的,产生大量的内存碎片,空间碎片太多会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而导致提前触发垃圾回收动作。
image.png

三、复制算法

与标记-清除算法相比,复制算法是一种相对高效的回收方法。它的核心思想是:将原有的内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清除正在使用中的内存块的所有对象,交换两个内存的角色,完成垃圾回收。如果系统中的垃圾对象很多,复制算法需要复制的存活对象数量并不会太大。因此,在真正需要垃圾回收的时刻,复制算法的效率还是很高的。又因为对象是在垃圾回收过程中统一被复制到新的内存空间中,因此,可确保回收后的内存空间没有碎片。但是仍然有个缺点,就是这个算法,要将系统内存折半。

   在java的新生代串行垃圾回收器中,使用了复制算法的思想。新生代分为eden空间,from空间和to空间三个部分,其中from和to空间可以视为用于复制的两块大小相同、地位相等,且可以进行角色互换的空间块。from和to空间也称为survivor空间,即幸存者空间,用于存放未被回收的对象。

    在垃圾回收时,Eden空间中的存活对象会被复制到未被使用的survivor空间中(假设to,如图s1),正在使用的survivor空间(假设from,如图s0)中的年轻对象也会被复制到to空间中(如图s1)(大对象,或者老年对象会直接进入老年代,如果to空间已经满了,对象也会直接进入老年代),此时eden空间和from空间中的剩余对象就是垃圾对象,可以直接清空,to空间则存放此次回收后的存活对象。这种复制算法,既可以保证空间的连续性,又避免了大量的内存空间浪费。

    复制算法比较适合新生代,因为新生代,存活对象比较少,复制算法会 比较好。如果存活对象较多的时候,就要进行较多的复制操作,效率会变低,更关键是,如果不想浪费50%的空间,就需要额外的空间进行分配。所以老年代一般不适合复制算法,接下来说的标记-整理算法,适合老年代进行回收。

image.png

四、标记-整理算法,也叫标记-压缩算法,这种算法适用于老年代回收,它是在标记-清除算法基础上进行了优化,首先也是需要从根节点开始,对所有要回收的对象进行标记,但是之后,不是清理要回收的对象,而是将所有存活的对象压缩到内存的一端,之后,清理边界外所有的所有的空间。这种方法既避免了碎片的发生,又不需要两块相同的内存空间,因此性价比高。
image.png

五、分代收集算法

当前虚拟机垃圾收集都采用分代收集算法,这种算法不是什么新的思想,只是根据对象存活周期的不同将内存进行分块,新生代每次垃圾收集时发现大批对象死去,只有少量存活,所以只要付出少量存活对象的复制成本就可以完成收集,所以适用于复制算法。老年代中因为对象存活率高、没有额外空间对它进行分配担保,所以适合于标记-清除算法或是标记-整理算法来回收。

目录
相关文章
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
68 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
6月前
|
算法 Java
并发垃圾回收算法对于大规模服务器应用的优势
并发垃圾回收算法对于大规模服务器应用的优势
|
6月前
|
算法 Java
一些常见的垃圾回收算法
这些是常见的垃圾回收算法,每个算法都有其优点和适用场景。
|
1月前
|
算法 JavaScript 前端开发
垃圾回收算法的原理
【10月更文挑战第13天】垃圾回收算法的原理
24 0
|
4月前
|
存储 算法 Java
JVM 垃圾回收算法与垃圾回收器
JVM 垃圾回收算法与垃圾回收器
46 3
|
3月前
|
算法 Java 应用服务中间件
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
|
4月前
|
算法 Java
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
60 1
|
5月前
|
存储 算法 Java
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
58 1
|
5月前
|
监控 算法 Java
Java虚拟机(JVM)使用多种垃圾回收算法来管理内存,以确保程序运行时不会因为内存不足而崩溃。
【6月更文挑战第20天】Java JVM运用多种GC算法,如标记-清除、复制、标记-压缩、分代收集、增量收集、并行收集和并发标记,以自动化内存管理,防止因内存耗尽导致的程序崩溃。这些算法各有优劣,适应不同的性能和资源需求。垃圾回收旨在避免手动内存管理,简化编程。当遇到内存泄漏,可以借助VisualVM、JConsole或MAT等工具监测内存、生成堆转储,分析引用链并定位泄漏源,从而解决问题。
54 4
|
4月前
|
算法 Java 程序员
Java面试题:解释Java的垃圾回收机制,包括常见的垃圾回收算法。介绍一下Java的垃圾回收算法中的标记-压缩算法。
Java面试题:解释Java的垃圾回收机制,包括常见的垃圾回收算法。介绍一下Java的垃圾回收算法中的标记-压缩算法。
51 0
下一篇
无影云桌面