JVM的GC机制和常见GC算法

简介: @[toc]1. 堆内存的分代2. GC分类3. 什么是GC3.1 需要GC的内存区域3.2 GC回收的对象3.3 判断对象存活的两种算法3.3.1 引用计数3.3.2 可达性分析3.4 什么时候触发GC4. 常见的GC算法4.1 标记-清除算法4.2 复制算法4.3 标记-压缩算法

1. 堆内存的分代

堆中内存分为新生代和老年代,其中新生代又分为Eden区、(Survivor)from区、(Survivor)To区


32.png


2. GC分类

新生代垃圾回收器:Minor GC/Young GC

老年代垃圾回收器:Mojor GC/Old GC

整理回收:Full GC(回收堆区和方法区)


3. 什么是GC

垃圾收集(Garbage Collection)通常被称为GC

在程序运行时,内存空间是有限的,那么如何及时的把不再使用的对象清除将内存释放出来,这就是GC要做的事情


3.1 需要GC的内存区域

JVM中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动内存清理,因此内存垃圾回收主要集中于Java堆和方法区,程序运行期间,这部分内存的分配和使用都是动态的


33.png


3.2 GC回收的对象

当一个对象已经没有存活时,GC就会自动对其进行回收

判断对象是否存活有两种方法:引用计数和可达性分析


3.3 判断对象存活的两种算法

3.3.1 引用计数

每一个对象都有一个引用计数属性,新增一个引用时该属性 +1,引用释放时该属性 -1,当该属性为0时代表该对象可以被回收。


这种方法实现简单,缺点也很明显:需要额外的内存来计数、运行时需要维护计数器、无法解决循环引用的问题


3.3.2 可达性分析

  • 基本思路

通过一系列被称为 “ GC Roots ” 的根对象作为起始节点集,从这些结点开始,通过引用关系向下搜索,搜索走过的路径被称为 “ 引用链 ”,如果某个对象到 GC Roots 没有任何引用链相连,就说明该对象不可达,即可被回收

如下图所示,对象4、5、6可被回收


34.png

要想理解可达性分析算法,就得想明白这几个问题:什么是对象可达、GC Roots 是什么、哪些对象可以作为 GC Roots


什么是对象可达


对象可达指的就是双方之间存在直接或间接的引用关系


GC Roots 是什么


GC Roots 就是 JVM 确定当前绝对不会被回收的对象,只要找到这种对象,此对象所依赖的其他对象肯定也不能被回收


哪些对象可被当作 GC Roots


方法区静态属性引用的对象


全局对象的一种,Class 对象本身很难被回收,只要 Class 对象不被回收,静态成员就不能被回收


方法区常量池引用的对象


也属于全局对象,常量本身初始化后不会改变,因此作为 GC Roots 也是合理的


被同步锁持有的对象


被 synchronized 锁住的对象是绝对不能回收的,GC 如果回收了对象,锁不就失效了嘛


3.4 什么时候触发GC

程序调用 System.gc 时触发

系统自身来决定GC触发的时机(根据Eden区和From Space区的内存大小来决定。当内存大小不足时,则会启动GC线程并停止应用线程)

GC又分为 minor GC 和 Full GC (也称为 Major GC )


Minor GC触发条件:当Eden区满时,触发Minor GC。


Full GC触发条件:


a.调用System.gc时,系统建议执行Full GC,但是不必然执行


b.老年代空间不足


c.方法去空间不足


d.通过Minor GC后进入老年代的平均大小大于老年代的可用内存


e.由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小


4. 常见的GC算法

4.1 标记-清除算法

该算法分为标记和清除两个阶段,标记就是把所有活动对象都做上标记的阶段,清除就是将没有做上标记的对象进行回收的阶段


4.2 复制算法

复制算法就是将内存空间按容量分成两块。当这一块内存用完时,就将存活着的对象复制到另一块上面,然后将已经使用过的一块一块清除掉


4.3 标记-压缩算法

标记-压缩算法与标记-清除算法类似,只是后续步骤是让所有存活的对象移动到一端,然后清除掉端边界以外的内存。


目录
相关文章
|
11天前
|
算法 网络协议 Java
【JVM】——GC垃圾回收机制(图解通俗易懂)
GC垃圾回收,标识出垃圾(计数机制、可达性分析)内存释放机制(标记清除、复制算法、标记整理、分代回收)
|
3月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
110 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
2月前
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。
|
2月前
|
算法 Java
JVM有哪些垃圾回收算法?
(1)标记清除算法: 标记不需要回收的对象,然后清除没有标记的对象,会造成许多内存碎片。 (2)复制算法: 将内存分为两块,只使用一块,进行垃圾回收时,先将存活的对象复制到另一块区域,然后清空之前的区域。用在新生代 (3)标记整理算法: 与标记清除算法类似,但是在标记之后,将存活对象向一端移动,然后清除边界外的垃圾对象。用在老年代
23 0
|
3月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
88 3
|
3月前
|
缓存 前端开发 Java
JVM知识体系学习二:ClassLoader 类加载器、类加载器层次、类过载过程之双亲委派机制、类加载范围、自定义类加载器、编译器、懒加载模式、打破双亲委派机制
这篇文章详细介绍了JVM中ClassLoader的工作原理,包括类加载器的层次结构、双亲委派机制、类加载过程、自定义类加载器的实现,以及如何打破双亲委派机制来实现热部署等功能。
86 3
|
3月前
|
算法 Java
JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
本文详细介绍了JVM中的GC算法,包括年轻代的复制算法和老年代的标记-整理算法。复制算法适用于年轻代,因其高效且能避免内存碎片;标记-整理算法则用于老年代,虽然效率较低,但能有效解决内存碎片问题。文章还解释了这两种算法的具体过程及其优缺点,并简要提及了其他GC算法。
 JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
|
12天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
145 80
|
6天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
8天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。