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 扩展:常见的垃圾收集器


相关文章
|
9月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
810 55
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
358 27
|
11月前
|
存储 算法 Java
G1原理—5.G1垃圾回收过程之Mixed GC
本文介绍了G1的Mixed GC垃圾回收过程,包括并发标记算法详解、三色标记法如何解决错标漏标问题、SATB如何解决错标漏标问题、Mixed GC的过程、选择CollectSet的算法
G1原理—5.G1垃圾回收过程之Mixed GC
|
11月前
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
9月前
|
缓存 算法 Java
JVM深入原理(八)(一):垃圾回收
弱引用-作用:JVM中使用WeakReference对象来实现软引用,一般在ThreadLocal中,当进行垃圾回收时,被弱引用对象引用的对象就直接被回收.软引用-作用:JVM中使用SoftReference对象来实现软引用,一般在缓存中使用,当程序内存不足时,被引用的对象就会被回收.强引用-作用:可达性算法描述的根对象引用普通对象的引用,指的就是强引用,只要有这层关系存在,被引用的对象就会不被垃圾回收。引用计数法-缺点:如果两个对象循环引用,而又没有其他的对象来引用它们,这样就造成垃圾堆积。
227 0
|
9月前
|
算法 Java 对象存储
JVM深入原理(八)(二):垃圾回收
Java垃圾回收过程会通过单独的GC线程来完成,但是不管使用哪一种GC算法,都会有部分阶段需要停止所有的用户线程。这个过程被称之为StopTheWorld简称STW,如果STW时间过长则会影响用户的使用。一般来说,堆内存越大,最大STW就越长,想减少最大STW,就会减少吞吐量,不同的GC算法适用于不同的场景。分代回收算法将整个堆中的区域划分为新生代和老年代。--超过新生代大小的大对象会直接晋升到老年代。
220 0
|
11月前
|
监控 算法 Java
JVM—垃圾收集算法和HotSpot算法实现细节
JVM的垃圾收集算法和HotSpot的实现细节复杂但至关重要,通过理解和掌握这些算法,可以为Java应用程序选择合适的垃圾收集器,并进行有效的性能调优。选择适当的垃圾收集策略,结合合理的内存配置和日志分析,能够显著提升应用的运行效率和稳定性。
244 15
|
11月前
|
存储 算法 Java
G1原理—6.G1垃圾回收过程之Full GC
本文详细探讨了G1垃圾回收器对Full GC(FGC)的优化处理,涵盖FGC的前置处理、整体流程及并行化改进。重点分析了传统FGC串行化的局限性以及G1通过Region分区和RSet机制实现并行标记的优势,包括任务窃取提升效率、跨分区压缩以生成空闲Region等技术细节。此外,文章还介绍了G1的新特性——字符串去重优化,通过判断char数组一致性减少重复字符串占用内存,从而提升内存使用效率。总结部分全面回顾了G1在FGC中的各项优化措施及其带来的性能改善。
G1原理—6.G1垃圾回收过程之Full GC
|
11月前
|
存储 算法 Java
G1原理—4.G1垃圾回收的过程之Young GC
本文详细解析了G1垃圾回收器中YGC(Young Generation Collection)的完整流程,包括并行与串行处理阶段。内容涵盖YGC相关参数设置、YGC与Mixed GC及FGC的关系、新生代垃圾回收的具体步骤(如标记存活对象、复制到Survivor区、动态调整Region数量等),以及并行阶段的多线程操作和串行阶段的关键任务(如处理软引用、整理卡表、重构RSet)。
G1原理—4.G1垃圾回收的过程之Young GC
|
机器学习/深度学习 监控 算法
Java虚拟机(JVM)的垃圾回收机制深度剖析####
本文深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法、性能调优策略及未来趋势。通过实例解析,为开发者提供优化Java应用性能的思路与方法。 ####
330 28