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


相关文章
|
4天前
|
存储 算法 Oracle
极致八股文之JVM垃圾回收器G1&ZGC详解
本文作者分享了一些垃圾回收器的执行过程,希望给大家参考。
|
2月前
|
Arthas 监控 Java
(十一)JVM成神路之性能调优篇:GC调优、Arthas工具详解及各场景下线上最佳配置推荐
“在当前的互联网开发模式下,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代开发过程中炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题”。
101 3
|
19天前
|
存储 算法 Java
JVM自动内存管理之垃圾收集算法
文章概述了JVM内存管理和垃圾收集的基本概念,提供一个关于JVM内存管理和垃圾收集的基础理解框架。
JVM自动内存管理之垃圾收集算法
|
14天前
|
缓存 监控 Java
"Java垃圾回收太耗时?阿里HBase GC优化秘籍大公开,让你的应用性能飙升90%!"
【8月更文挑战第17天】阿里巴巴在HBase实践中成功将Java垃圾回收(GC)时间降低90%。通过选用G1垃圾回收器、精细调整JVM参数(如设置堆大小、目标停顿时间等)、优化代码减少内存分配(如使用对象池和缓存),并利用监控工具分析GC行为,有效缓解了高并发大数据场景下的性能瓶颈,极大提升了系统运行效率。
33 4
|
2月前
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
|
15天前
|
算法 Java 应用服务中间件
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
|
15天前
|
存储 监控 算法
深入解析JVM内部结构及GC机制的实战应用
深入解析JVM内部结构及GC机制的实战应用
|
13天前
|
Java Docker 索引
记录一次索引未建立、继而引发一系列的问题、包含索引创建失败、虚拟机中JVM虚拟机内存满的情况
这篇文章记录了作者在分布式微服务项目中遇到的一系列问题,起因是商品服务检索接口测试失败,原因是Elasticsearch索引未找到。文章详细描述了解决过程中遇到的几个关键问题:分词器的安装、Elasticsearch内存溢出的处理,以及最终成功创建`gulimall_product`索引的步骤。作者还分享了使用Postman测试接口的经历,并强调了问题解决过程中遇到的挑战和所花费的时间。
|
11天前
|
存储 算法 Oracle
不好意思!耽误你的十分钟,JVM内存布局还给你
先赞后看,南哥助你Java进阶一大半在2006年加州旧金山的JavaOne大会上,一个由顶级Java开发者组成的周年性研讨会,公司突然宣布将开放Java的源代码。于是,下一年顶级项目OpenJDK诞生。Java生态发展被打开了新的大门,Java 7的G1垃圾回收器、Java 8的Lambda表达式和流API…大家好,我是南哥。一个Java学习与进阶的领路人,相信对你通关面试、拿下Offer进入心心念念的公司有所帮助。
不好意思!耽误你的十分钟,JVM内存布局还给你
|
19天前
|
存储 Java 程序员
JVM自动内存管理之运行时内存区
这篇文章详细解释了JVM运行时数据区的各个组成部分及其作用,有助于理解Java程序运行时的内存布局和管理机制。
JVM自动内存管理之运行时内存区
下一篇
云函数