【JVM系列】Full GC(完全垃圾回收)的原因及分析

news2024/10/6 12:17:42

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
    • 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

      • 1. 堆内存不足
      • 2. 老年代空间不足
      • 3. 显式调用 System.gc()
      • 4. 内存泄漏
      • 5. 持久代(PermGen)空间不足
      • 6. 垃圾收集器的选择
      • 7. 应用程序行为
      • 8. JVM 参数设置不当
      • 9. 外部因素
      • 10. 代码优化不足
      • 预防和优化 Full GC 的策略
      • 结论

在 Java 虚拟机(JVM)中,垃圾回收(Garbage Collection,GC)是自动内存管理的关键部分。Full GC,也称为 Major GC 或 Mark-Sweep-Compact,是一种全面清理 JVM 堆内存的垃圾回收事件。Full GC 通常成本较高,因为它会暂停应用程序的执行,直到回收过程完成。以下是一些导致 Full GC 的原因,以及它们对应用程序性能可能产生的影响。

在这里插入图片描述

1. 堆内存不足

当 JVM 堆内存的使用量接近其最大容量时,Full GC 会被触发以释放内存。这种情况通常发生在应用程序持续分配新对象,而旧对象由于某些原因没有被及时回收。

2. 老年代空间不足

即使堆内存总容量尚未耗尽,如果老年代(Old Generation)空间不足,也可能导致 Full GC。老年代是存放长期存活对象的区域,当这些对象占用的空间超过阈值时,Full GC 会被触发。

3. 显式调用 System.gc()

Java 提供了System.gc()方法,允许开发者显式请求垃圾回收。虽然现代 JVM 优化了垃圾回收算法,减少了 Full GC 的发生,但显式调用System.gc()仍然可能触发 Full GC。

4. 内存泄漏

内存泄漏是指应用程序中的对象不再被使用,但由于某些原因(如循环引用)仍然被保留在内存中。随着时间的推移,这些泄漏的对象会占用越来越多的内存,最终导致 Full GC。

5. 持久代(PermGen)空间不足

在 Java 8 之前,JVM 使用持久代(PermGen)来存储类的元数据。如果类元数据占用的空间过多,也会导致 Full GC。自 Java 8 起,PermGen 已被元空间(Metaspace)取代。

6. 垃圾收集器的选择

不同的垃圾收集器有不同的回收策略。例如,Serial、Parallel、CMS(Concurrent Mark-Sweep)和 G1(Garbage-First)等收集器在处理内存回收时的行为有所不同。某些收集器在特定情况下可能更倾向于触发 Full GC。

7. 应用程序行为

应用程序的特定行为,如大量使用缓存或临时数据,可能导致内存使用量急剧增加,进而触发 Full GC。

8. JVM 参数设置不当

JVM 参数设置不当,如堆大小(-Xms, -Xmx)、新生代大小(-Xmn)和 Eden 区与 Survivor 区的比例,都可能影响 Full GC 的触发。

9. 外部因素

外部因素,如操作系统的内存压力,也可能导致 JVM 触发 Full GC 以释放内存,以满足系统级别的内存需求。

10. 代码优化不足

代码中存在效率低下的实现,如频繁创建临时对象或使用大型数据结构,可能导致内存使用效率低下,增加 Full GC 的频率。

预防和优化 Full GC 的策略

  • 监控和诊断:使用 JVM 监控工具,如 VisualVM 或 JConsole,来监控内存使用情况和 GC 事件。
  • 代码优化:审查代码,避免内存泄漏和不必要的对象创建。
  • 调整 JVM 参数:根据应用程序的内存需求合理设置 JVM 参数。
  • 选择合适的垃圾收集器:根据应用程序的特点选择合适的垃圾收集器,以减少 Full GC 的发生。
  • 内存泄漏检测:使用工具检测内存泄漏,并修复相关问题。

在这里插入图片描述

结论

Full GC 是 JVM 在内存管理中的一种重要机制,但频繁的 Full GC 会影响应用程序的性能。了解 Full GC 的触发原因,并采取相应的预防和优化措施,可以帮助开发者提高应用程序的稳定性和性能。通过监控、代码优化、参数调整和选择合适的垃圾收集器,可以有效地减少 Full GC 的发生,从而提升用户体验。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

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

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

相关文章

IDA*——AcWing 180. 排书

IDA* 定义 IDA*(Iterative Deepening A*)是一种结合了深度优先搜索(DFS)的递归深度限制特性和A搜索的启发式估价函数的搜索算法。它主要用于解决启发式搜索问题,尤其是当搜索空间很大或者搜索成本不确定时。 IDA* 是…

分享大厂对于缓存操作的封装

hello,伙伴们好久不见,我是shigen。发现有两周没有更新我的文章了。也是因为最近比较忙,基本是993了。 缓存大家再熟悉不过了,几乎是现在任何系统的标配,并引申出来很多的问题:缓存穿透、缓存击穿、缓存雪崩…

markdown导入其它markdown文件

相应语法 [toc] # 测试不同功能 <p> 这是类似超链接的管理方式 </p>[链接测试0](./part0/uml_base.md)[链接测试1](./part1/math_base.md)---<p> 这是直接导入文件的管理方式 </p>import "./part0/uml_base.md"---import "./part1/mat…

arm64架构kvm情景分析 - type1型和type2型虚拟机管理器

内核版本&#xff1a;linux-v5.9 架构&#xff1a;arm64 1 type1型和type2虚拟机管理器 在arm64架构中&#xff0c;共有EL3到EL0四个异常级别&#xff0c;EL3异常级别最高。通常操作系统&#xff08;如linux&#xff09;运行在EL1&#xff0c;应用程序运行在EL0&#xff0c;EL…

S32DS S32 Design Studio for S32 Platform 3.5 代码显示行号与空白符

介绍 NXP S32DS&#xff0c;全称 S32 Design Studio&#xff0c;s32 系列芯片默认使用 S32 Design Studio for S32 Platform 作为 IDE 集成开发环境&#xff0c;当前版本 S32 Design Studio for S32 Platform 3.5&#xff0c;IDE 可以简称 s32DS 使用 S32DS&#xff0c;可以认…

python操作SQLite3数据库进行增删改查

python操作SQLite3数据库进行增删改查 1、创建SQLite3数据库 可以通过Navicat图形化软件来创建: 2、创建表 利用Navicat图形化软件来创建: 存储在 SQLite 数据库中的每个值(或是由数据库引擎所操作的值)都有一个以下的存储类型: NULL. 值是空值。 INTEGER. 值是有符…

JavaWeb开发基础7个Web术语解析

7个Web术语 Website: static vs dynamic HTTP HTTP Requests GET vs POST Servlet Container Server: Web vs Application Content Type Website: static vs dynamic 网站内容包括文本、图片、音频、视频&#xff0c;通过URL来访问。网站分为静态网站和动态网站。 静态网…

LLMs之gptpdf:gptpdf的简介、安装和使用方法、案例应用之详细攻略

LLMs之gptpdf&#xff1a;gptpdf的简介、安装和使用方法、案例应用之详细攻略 目录 gptpdf的简介 1、处理流程 第一步&#xff0c;使用 PyMuPDF 库&#xff0c;对 PDF 进行解析出所有非文本区域&#xff0c;并做好标记&#xff0c;比如: 第二步&#xff0c;使用视觉大模型&…

【数智化人物展】天云数据CEO雷涛:大模型连接数据库 为数智化提供高价值数据...

雷涛 本文由天云数据CEO雷涛投递并参与由数据猿联合上海大数据联盟共同推出的《2024中国数智化转型升级先锋人物》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 这几天&#xff0c;奥特曼讲SQL数据库和大模型结合起来会产生什么样的化学变化引起行业关注。为…

13.SQL注入-宽字节

SQL注入-宽字节 含义&#xff1a; MySQL是用的PHP语言&#xff0c;然后PHP有addslashes()等函数&#xff0c;这类函数会自动过滤 ’ ‘’ null 等这些敏感字符&#xff0c;将它们转义成’ ‘’ \null&#xff1b;然后宽字节字符集比如GBK它会自动把两个字节的字符识别为一个汉…

frp技术

说明&#xff1a;frp&#xff08;https://github.com/fatedier/frp&#xff09; 是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c;且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露…

19.JWT

1►JWT博客推荐 阮老师讲得很好了&#xff0c;网址如下&#xff1a; http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html 2►ry是怎么践行JWT的呢&#xff1f; 问题一&#xff1a;不登录的时候有token吗&#xff1f; 答&#xff1a;没有&#xff0c;所…

中标麒麟 RAC 19c 部署(Openssh免密BUG解决方案)

部署环境&#xff1a; 主机一主机二host ip192.168.80.46192.168.80.47vip 192.168.80.48192.168.80.49private ip192.168.10.10192.168.10.11storage ip192.168.20.33192.168.20.34主机名rac19c1rac19c2 需要上传的软件包&#xff1a; 一.虚拟机配置 选择中标麒麟IOS文件&am…

关于 element-ui el-cascader 数据回显问题的解决方案

前言 这两天在使用 el-cascader 控件时&#xff0c;后端日期的数据如“2023-05-06”前端需要按照“年-月-日”的形式分割成三级联动&#xff0c;因为数据库保存的是完整的日期&#xff0c;前端数据回显时需要对后端返回的数据进行处理。 问题再现 联动下拉框的数据如下&#x…

昇思25天学习打卡营第十四天|Pix2Pix实现图像转换

训练营进入第十四天&#xff0c;今天学的内容是Pix2Pix图像转换&#xff0c;记录一下学习内容&#xff1a; Pix2Pix概述 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN, Condition Generative Adversarial Networks &#xff09;实现的一种深度学习图像转换模型&#xff0c…

C语言 -- 扫雷游戏

C语言 – 扫雷游戏 游戏规则&#xff1a; 给定一个棋盘&#xff0c;玩家需要排查出所有隐藏的雷&#xff0c;也就是选择出所有不是雷的地方。 玩家选择位置&#xff0c;若此处有雷&#xff0c;玩家被炸死&#xff0c;游戏结束&#xff1b; 若此处无雷&#xff0c;此处提示周围一…

【SOLID原则前端中的应用】里氏替换原则(Liskov Substitution Principle,LSP)- vue3示例

里氏替换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09;规定&#xff0c;子类对象必须能够替换父类对象&#xff0c;并且程序的行为保持不变。 在Vue 3中&#xff0c;这意味着我们在创建可替换的组件时&#xff0c;应该确保子组件能够完全替代父组…

Spring源码十五:Bean的加载

上一篇我们通过Spring源码十四&#xff1a;Spring生命周期介绍了refresh的最后两个方法&#xff0c;至此通过前面大概十篇左右的篇幅介绍完了Spring容器初始化&#xff0c;接下来&#xff0c;将进入Spring另外一个模块Bean相关的知识点。 在Spring框架中&#xff0c;Bean加载过…

动态白色小幽灵404网站源码

动态白色小幽灵404网站源码&#xff0c;页面时单页HTML源码&#xff0c;将代码放到空白的html里面&#xff0c;鼠标双击html即可查看效果&#xff0c;或者上传到服务器&#xff0c;错误页重定向这个界面即可&#xff0c;喜欢的朋友可以拿去使用 <!DOCTYPE html> <ht…

联想小新14Pro,误删了一个注册表,怎么办?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…