Java垃圾回收机制GC完全指南,让你彻底理解JVM运行原理

news2025/1/22 16:11:24

1、GC过程

1)先判断对象是否存活(是否是垃圾)

可以通过引用计数算法和可达性分析算法来判断,由于引用计数算法无法解决循环引用的问题,所以目前使用的都是可达性分析算法

2)再遍历并回收对象(回收垃圾)

可以通过垃圾收集器(Serial/Parallel/CMS/G1)来回收垃圾,垃圾收集器使用的算法标记清除算法、标记整理算法、复制回收算法和分代回收算法。

2、GC种类

3、GC收集方法

标记清除:先标记,标记完毕之后再清除,效率不高,会产生碎片

标记整理:标记完毕之后,让所有存活的对象向一端移动

复制回收:Eden区S0、S1 区比例为8:1:1 ,就是上面谈到的 YGC使用的就是复制回收算法。

4、GC收集器

4.1 几种收集器

1)Serial收集器

一个单线程的收集器,在进行垃圾收集时候,必须暂停其他所有的工作线程直到它收集结束。

特点:CPU利用率最高,停顿时间即用户等待时间比较长。

适用场景:小型应用

通过JVM参数-XX:+UseSerialGC可以使用串行垃圾回收器。

2)Parallel收集器(jdk8默认收集器)

采用多线程来通过扫描并压缩堆

特点:停顿时间短,回收效率高,对吞吐量要求高。

适用场景:大型应用,科学计算,大规模数据采集等。

通过JVM参数 XX:+USeParNewGC 打开并发标记扫描垃圾回收器。

3)CMS收集器

采用“标记-清除”算法实现,使用多线程的算法去扫描堆,对发现未使用的对象进行回收。

(1)初始标记

(2)并发标记

(3)并发预处理

(4)重新标记

(5)并发清除

(6)并发重置

特点:响应时间优先,减少垃圾收集停顿时间

适应场景:服务器、电信领域等。

通过JVM参数 -XX:+UseConcMarkSweepGC设置

4)G1收集器(jdk17默认收集器)

在G1中,堆被划分成 许多个连续的区域(region)。采用G1算法进行回收,吸收了CMS收集器特点。

特点:支持很大的堆,高吞吐量

--支持多CPU和垃圾回收线程

--在主线程暂停的情况下,使用并行收集

--在主线程运行的情况下,使用并发收集

实时目标:可配置在N毫秒内最多只占用M毫秒的时间进行垃圾回收

通过JVM参数 –XX:+UseG1GC 使用G1垃圾回收器

4.2 几种收集器对比

5、GC小结

在整个垃圾回收各概念之间的关系

  • GC收集器核心是GC收集算法
  • GC收集算法一般先要判断对象是否存活就会用到引用计数算法或可达性分析算法
  • 引用计数算法解决不了循环引用的情况,所以目前使用的都是可达性分析算法
  • GC分为4个种类,作用在内存的不同区域(新生代Eden/S0/S1、老年代)。这时GC收集器会相互组合完成不同种类的GC,从而达到JVM GC的功能

6、相关问题

Java GC是一种自动内存管理机制,用于检测和清除不再使用的对象。它的主要作用是释放内存空间以供程序继续使用。

2. 在Java中有哪些不同类型的GC算法?

在Java中有几种不同类型的GC算法,包括标记-清除、复制、标记-整理、分代算法和增量垃圾收集器等。

3. 请解释什么是Minor GC和Major GC,以及它们之间的区别。

Minor GC用于清除新生代存活的对象,而Major GC用于清除老年代存活的对象。Minor GC通常比Major GC更频繁,而且速度也更快。

4. 堆是什么?在Java中如何管理堆?

堆是Java运行时数据区域之一,用于存储对象实例。在Java中,可以通过设置-Xmx和-Xms参数来控制堆的大小,从而管理堆。

5. 什么是垃圾收集器?在Java中有哪些不同类型的垃圾收集器?

垃圾收集器负责执行垃圾回收操作。在Java中,有几种不同类型的垃圾收集器,包括串行收集器、并行收集器、CMS收集器和G1收集器等。

6. 描述垃圾收集过程。当垃圾收集器运行时会发生什么?

在垃圾收集期间,垃圾收集器会扫描堆内存中的对象,并标记出所有不再使用的对象。然后,它将这些对象从堆中删除,以释放内存空间。

7. 为什么需要避免频繁的垃圾收集?

频繁进行垃圾收集会导致程序性能下降,因为垃圾收集器需要占用CPU时间和内存资源。此外,频繁的垃圾收集还会导致应用程序出现延迟或停顿。

8. 如何使用Java代码手动触发GC?

在Java中,可以使用System类的gc()方法手动触发GC。但需要注意的是,调用该方法并不保证会立即进行垃圾回收,因为Java的垃圾回收机制是由JVM自动管理的。

9. 描述分代垃圾收集算法。在Java中为什么使用分代垃圾收集?

分代垃圾收集算法将堆划分为新生代和老年代,根据对象的特性选择不同的垃圾收集方式。在Java中使用分代垃圾收集可以提高垃圾收集的效率,因为大部分对象都是短暂的,只存在于新生代中。

10. 如何优化GC性能?在进行调整时需要注意什么?

可以通过调整堆大小、设置垃圾收集器和调整垃圾收集器参数等方法来优化GC性能。在进行调整时需要注意不能过度调整,否则会导致性能下降或应用程序出现异常。


最后推荐一下文章中作图工具:

​​​​​​​

​​​​​​​

ProcessOnhttps://www.processon.com/i/5b100cd0e4b06350d44a08ac?full_name=%E7%8E%84%E6%98%8EHanko

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/414126.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Schrödinger Python API系列教程 -- 介绍 (一)

使用Schrdinger Python API系列教程 – 介绍 (一) 本文档可从Schrdinger网站www.schrodinger.com/pythonapi访问。 从Python文档字符串生成的完整API文档可以在这里访问 介绍 在最高级别上,Schrdinger Python API提供了一个基本的分子结构类,并允许与…

redis总结之-jedis

redis总结之-jedis4. Jedis4.1 Jedis简介4.1.1 编程语言与redis4.1.2 准备工作4.1.3 代码实现4.2 Jedis简易工具类开发4.2.1 基于连接池获取连接4.2.2 封装连接参数4.2.3 加载配置信息4.2.4 获取连接4.3 可视化客户端总结计划 1. Redis 入 门(了解)&…

LNMP网站框架搭建(编译安装的方式)

1. Nginx的工作原理 php-fpm.conf 是控制php-fpm守护进程的 php.ini是php解析器 工作进程: 1.客户端通过域名进行请求访问时,会找Nginx对应的虚拟主机 2. Nginx对该请求进行判断,如果是静态请求,Nginx会自行处理,并将处理结果…

因果推断14--DRNet论文和代码学习

目录 论文介绍 代码实现 DRNet ReadMe 因果森林 论文介绍 因果推断3--DRNet(个人笔记)_万三豹的博客-CSDN博客 摘要:估计个体在不同程度的治疗暴露下的潜在反应,对于医疗保健、经济学和公共政策等几个重要领域具有很高的实…

ERP系统有什么用?主要是这三方面

ERP 是Enterprise Resource Planning 的缩写,即企业资源计划系统,是建立在信息技术基础上,以系统化的管理思想,为企业决策层及员工提供决策运行手段的管理平台。它实现了企业内部资源和企业相关的外部资源的整合。通过软件把企业的人、财、物、产、供、销及相应的物…

socket 到底是个啥

哈喽大家好,我是咸鱼 我相信大家在面试过程中或多或少都会被问到这样一个问题:你能解释一下什么是 socket 吗 我记得我当初的回答很是浅显:socket 也叫套接字,用来负责不同主机程序之间的网络通信连接,socket 的表现…

整柜海运到美国的规格和收费标准是什么

整柜海运是指将所有货物安装在一个整箱内,由发货人和收货人共同操作,而目的港的收货人一般只有一个,方便操作。整柜海运到美国的主要流程有以下几个步骤:订舱、装柜、报关、海运、清关、提柜和送货。实际上,国际物流出…

IDEA 2023.1 最新变化

IntelliJ IDEA 2023.1 最新变化 在 IntelliJ IDEA 2023.1 中,我们根据用户的宝贵反馈对新 UI 做出了大量改进。 我们还实现了性能增强,从而更快导入 Maven,以及在打开项目时更早提供 IDE 功能。 新版本通过后台提交检查提供了简化的提交流程…

写博客8年与人生第一个502万

题记:我们并非生来强大,但依然可以不负青春。 原本想好好写一下如何制定一个目标并通过一点一滴的努力去实现,这三年反思发现其实写自己的经历并不重要。 很多人都听过一句话:榜样的力量是无穷的。 更现实和实际的情况是&#x…

【LeetCode】每日一题:移除元素

目录 题目: 思想1:暴力解法 思想2:创建一个temp数组 思想3:双指针 👻内容专栏:《LeetCode刷题专栏》 🐨本文概括:27.移除元素 🐼本文作者:花 碟 &#x1…

电商评论数据爬取--R语言

1.网络爬虫 1.1 什么是网络爬虫 网络爬虫(web crawler),也被称为网络蜘蛛(web spider),是在万维网浏览网页并按照一定规则提取信息的脚本或者程序。 浏览网页时,一般流程如下: 利…

C++语法(17)---- 二叉搜索树

1.概念 1.父节点的左子树全小于本身 2.父节点的右子树全大于本身 3.左右子树也是二叉搜索树 时间复杂度:O(N),有可能只有左数,这样就遍历了所有,所有复杂度为N 平衡二叉树的时间复杂度才是:O(logN) 2.模拟 1.数据元素…

Postman抓包教程

目录 什么是抓包? 如何使用 Postman 进行抓包 查看历史抓包数据 使用抓包数据进行接口测试和开发 抓包技巧和注意事项 什么是抓包? 在计算机网络中,抓包是指捕获网络流量的过程。抓包工具可以截获进出计算机网络的数据流,并将…

反向传播推导+numpy实现

很久没有看深度学习了,忘了好多东西。本来想着推导一下,后来发现自己不会了。 再看看以前写的代码,又避开了最终的东西,于是决定重新推导一下。 数据的说明 首先,我们要做一个回归的任务,我们使用numpy随…

5.Java循环控制语句

Java循环控制语句 循环是Java中应用最为广泛的一个知识点,所以也是很需要掌握的。所谓循环,即通过判断条件,重复执行一段代码,根据条件的变化,来确定代码是否执行,执行次数。 一、循环结构 1、while循环…

Java IO常用操作详解(代码示例)

概览 Java I/O操作指的是数据的输入/输出操作。 Java的I/O操作类在java.io包中,主要分以下几种: 基于字节操作的I/O接口: InputStream和OutputStream基于字符操作的I/O接口: Writer和Reader基于磁盘操作的I/O接口: …

5个令人惊艳的AI项目,开源了。。

大家好,我是 Jack。 今天清明,小伙伴们都去哪里玩了? 上个月我已经出去浪过了,清明就老实在家歇着了。 翻看了一些最近热点的开源项目,发现还是 AIGC 的天下。 今天,我将继续着重挑选几个近期的优质开源…

2023第十四届蓝桥杯C++B组菜鸡的落幕

时隔几天,终于还是忍不住来复盘一下蓝桥杯了,还记得去年参加做下填空,再做对个把编程,后面不会的大题打打表混混分,最后就能混个省奖, 这回估计凉透了,填空没对似乎,编程也没对几个,…

Kettle8.2.0连接Hive3.1.2(踩坑,亲测有效)

这是目前遇到的最简单但最头疼的安装,因为是在公司之前用过的服务器上进行安装测试,加上又使用比较新的版本,结果踩了不少坑。Kettle连接Hive这个坑,从2023年4月11日下午开始,一致到2023年4月12日中午才弄好&#xff0…

uni-app常用配置

保存自动格式化 工具》设置》编辑器设置》保存时自动格式化 JS语法检查 安装eslint-js插件eslint-js - DCloud 插件市场 用于校验js和html中的js代码https://ext.dcloud.net.cn/plugin?id2037工具》设置》插件配置》eslint-js 启用实时校检 Vue语法检查 安装eslint-vue插…