JVM GC和常见垃圾回收算法

简介: JVM GC和常见垃圾回收算法

1 GC要做的四件事

2 判断哪些是垃圾

2.1 引用计数法

在Java中,引用和对象是有关联的,如果要操作对象必须用引用进行,因此很显然一个办法就是通过引用计数来判断该对象是否可以回收,简单讲,如果一个对象没有任何与之关联的引用,即他的引用计数都不为0,则说明对象不太可能被用到,那么这个对象就是可回收对象。

2.2 根搜索算法(可达性分析)

因为引用计数法存在引用循环的问题,Java还使用了可达性分析的方法,通过一系列的“GC roots”对象作为起点搜索,如果在“GC roots”和一个对象之间没有可达的路径,则称该对象是不可达的。注意的是不可达对象不一定是可回收对象,需要经过两次不可达标记后才能被确定为可回收对象

3 怎么回收垃圾(垃圾回收算法)

3.1 标记清除法(Mark-Sweep)

最简单的垃圾回收算法,分为两个阶段,标记和清除,标记阶段标记出所有将要回收的对象,清除阶段将被标记的对象空间进行回收。

(该图片来着网络,如有侵权请联系删除)

遗留问题:内存的碎片化严重,后续可能会产生浪费。

3.2 复制算法(Coping)

为了解决标记清除法的内存碎片化问题,提出了复制算法,主要过程是将内存按容量相等的条件划分成两块,每次只使用其中的一般,当这一块内存满后将存活的对象复制到另一块上去,把已使用的清除掉。

(该图片来着网络,如有侵权请联系删除)

遗留问题:可用内存被压缩到了原来的一半,而且如果存活对象增多的话该算法的效率会降低

3.3 标记整理算法(Mark-Compact)

和Mark-Sweep算法相同,标记后不是清理对象,而是将存活对象移动到内存的另一端,然后删除端边界外的对象。

(该图片来着网络,如有侵权请联系删除)

3.4 分代收集算法(Generational Collecting)

目前大部分JVM采用的垃圾回收算法,其核心思想是根据对象存活的不同生命周期将内存划分为不同的区域,一般情况下将GC堆划分为老年代、新生代,相比之下新生代的回收次数和单次回收的数量要大于老年代。

3.4.1 新生代与复制算法

每次使用Eden空间和其中的一块Survivor空间,当进行回收时,将该两块空间中还存活的对象复制到另一块Survivor空间中。

3.4.2 老年代与标记复制算法

因为老年代每次回收对象较少,因此采用Mark-Compact算法。

当Eden Space和From Space内存不足时会发生一次GC,结束后存活的对象将会转移到To Space,当To Space内存不够时就会移动到老年代,对象在Survivor区躲过一次GC后,其年龄会+1 ,默认下年龄到15时对象会被移动到老年代。

4 不同内存区域垃圾的回收方式

4.1 新生代

使用Minor GC进行回收,采用复制算法,年轻代分为Eden区和Survivor 区。

Eden区:对象刚被创建的时候,存放在Eden 区,如果Eden区放不下,则放在Survivor区,甚至老年代中。

Survivor区: Minor回收时使用,将Eden中存活的对象存入Survior中(From),再一次Minor时,将Survior From 中的对

象存入Survior To中,清除Survior From,下一次Minor时重复次步骤,Survior From变成Survior To,Survior To变成

Survior From,依次循环,同时每次 Minor,对象的年龄都+1,年龄增加到一定程度的对象,移动到老年代中。

4.2 老年代

存放生命周期较长的对象,使用标记-清理算法或者标记-整理算法进行回收。

5 扩展:常见的垃圾收集器


相关文章
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
60 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
1月前
|
存储 监控 算法
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程 ?
尼恩提示: G1垃圾回收 原理非常重要, 是面试的重点, 大家一定要好好掌握
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程  ?
|
15天前
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。
|
1月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
43 3
|
1月前
|
算法 Java
JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
本文详细介绍了JVM中的GC算法,包括年轻代的复制算法和老年代的标记-整理算法。复制算法适用于年轻代,因其高效且能避免内存碎片;标记-整理算法则用于老年代,虽然效率较低,但能有效解决内存碎片问题。文章还解释了这两种算法的具体过程及其优缺点,并简要提及了其他GC算法。
 JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
|
29天前
|
算法 JavaScript 前端开发
垃圾回收算法的原理
【10月更文挑战第13天】垃圾回收算法的原理
22 0
|
2月前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
1月前
|
存储 Java PHP
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
58 0
|
2月前
|
监控 算法 Java
深入理解Java中的垃圾回收机制(GC)
本文将探讨Java的自动内存管理核心——垃圾回收机制。通过详细解析标记-清除算法、复制算法和标记-整理算法等常用垃圾回收算法,以及CMS、G1等常见垃圾回收器,帮助读者更好地理解Java应用的性能优化和内存管理。同时,探讨分代收集、分区收集等策略在实际项目中的应用。结语部分总结了垃圾回收机制在Java开发中的重要性,并展望了未来可能的发展。
52 0
|
3月前
|
缓存 监控 Java
"Java垃圾回收太耗时?阿里HBase GC优化秘籍大公开,让你的应用性能飙升90%!"
【8月更文挑战第17天】阿里巴巴在HBase实践中成功将Java垃圾回收(GC)时间降低90%。通过选用G1垃圾回收器、精细调整JVM参数(如设置堆大小、目标停顿时间等)、优化代码减少内存分配(如使用对象池和缓存),并利用监控工具分析GC行为,有效缓解了高并发大数据场景下的性能瓶颈,极大提升了系统运行效率。
73 4