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

news/2024/10/5 13:06:57/

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
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.ppmy.cn/news/1473773.html

相关文章

Postman深度解析:打造高效接口测试自动化流程

《Postman深度解析:打造高效接口测试自动化流程》 一、概述与Postman核心优势 1. 接口测试的重要性与挑战 接口测试是确保软件系统各组成部分能够正确交互的关键环节。随着现代软件系统的复杂性增加,接口的数量和类型也在不断增长,这给接口测…

免费的鼠标连点器电脑版教程!官方正版!专业鼠标连点器用户分享教程!2024最新

电脑技术的不断发展,许多用户在日常工作和娱乐中,需要用到各种辅助工具来提升效率或简化操作,而电脑办公中,鼠标连点器作为一种能够模拟鼠标点击的软件,受到了广大用户的青睐。本文将为大家介绍一款官方正版的免费鼠标…

RabbitMQ 更改服务端口号

需求 windows环境下,将RabbitMQ默认的端口号 5672 改为 11001 实现 本机RabbitMQ版本为3.8.16,找到配置文件位置,路径为:C:\Users\%USERNAME%\AppData\Roaming\RabbitMQ\advanced.config 配置文件默认内容为空 填写修改端口号…

JavaScript中的解构赋值:用途与优势

文章目录 JavaScript中的解构赋值:用途与优势一、简化数组和对象数据的访问数组解构对象解构 二、函数返回多个值三、与扩展运算符结合使用数组扩展对象扩展 四、默认值五、嵌套解构总结 JavaScript中的解构赋值:用途与优势 在JavaScript中,…

Meta低头,库克认错,XR回归第一性原理

图片|Photo by Maxim Hopman on Unsplash ©自象限原创 作者丨罗辑 2024年,XR的故事应该怎么讲? 如果从数据上看,这应该是个沉重的话题。 根据 IDC 报告,2023 年全球 VR 市场出货量下滑了 10.7%。2024 年第一…

go zero入门

一、goctl安装 goctl 是 go-zero 的内置脚手架,可以一键生成代码、文档、部署 k8s yaml、dockerfile 等。 # Go 1.16 及以后版本 go install github.com/zeromicro/go-zero/tools/goctllatest检查是否安装成功 $ goctl -v goctl version 1.6.6 darwin/amd64vscod…

EtherCAT转Profinet网关配置说明第一讲:配置软件安装及介绍

网关XD-ECPNS20为EtherCAT转Profinet协议网关,使EtherCAT协议和Profinet协议两种工业实时以太网网络之间双向传输 IO 数据。适用于具有EtherCAT协议网络与Profinet协议网络跨越网络界限进行数据交换的解决方案。 本网关通过上位机来进行配置。 首先安装上位机软件 一…

Unity中使用VectorGraphics插件时,VectorUtils.RenderSpriteToTexture2D方法返回结果错误的解决方法

Unity中使用VectorGraphics插件时,如果使用VectorUtils.BuildSprite方法创建Sprite,那么得到的Sprite往往是一个三角网格数比较多的Sprite,如果想要得到使用贴图只有两个三角面的方形Sprite,可以使用该插件提供的VectorUtils.Rend…