Full GC的认识、预防和定位

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨
👀👀👀 个人博客:小奥的博客
👍👍👍:个人CSDN
⭐️⭐️⭐️:传送门
🍹 本人24应届生一枚,技术和水平有限,如果文章中有不正确的内容,欢迎多多指正!
📜 欢迎点赞收藏关注哟! ❤️

文章目录

  • JVM之带你认识Full GC
  • 一. 主要的GC形式
    • 1.1 新生代GC(Minor GC)触发机制
    • 1.2 老年代GC(Major GC 、Full GC)触发机制
  • 二、Full GC的一些问题
    • 2.1 Full GC对程序的影响
    • 2.2 如何防止Full GC
    • 2.3 如何定位Full GC

JVM之带你认识Full GC

一. 主要的GC形式

JVM在进行GC时,并非每次都对所有内存区域进行垃圾回收,大部分回收的都是指新生代。

针对Hotspot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC)

  • 部分收集(Partial GC):不是完整收集整个Java堆的垃圾收集。其中又分为:

    • 新生代收集(Minor GC / Young GC):只是新生代的垃圾收集
    • 老年代收集(Major GC / Old GC):只是老年代的圾收集。
      • 目前,只有CMS GC会有单独收集老年代的行为。
      • 注意,很多时候Major GC会和Full GC混淆使用,需要具体分辨是老年代回收还是整堆回收。
    • 混合收集(MixedGC):收集整个新生代以及部分老年代的垃圾收集。
      • 目前,只有G1 GC会有这种行为
  • 整堆收集(Full GC):收集整个java堆和方法区的垃圾收集。

1.1 新生代GC(Minor GC)触发机制

  • 当新生代空间不足时,就会触发Minor GC,这里的新生代空间不足是指Eden区满,Survivor区满不会引发GC。(每次Minor GC会清理年轻代的内存)
  • 因为Java对象大多数都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。
  • Minor GChi引发 STW,暂停用户其他线程,等垃圾回收结束,才会恢复用户线程。

1.2 老年代GC(Major GC 、Full GC)触发机制

(1)Major GC触发时机

  • 出现了Major GC,经常会伴随至少一次的Minor GC。也就是说老年代空间不足时,会现场时触发Minor GC,如果之后空间还不足,则触发Major GC。
  • Major GC的速度一般比Minor GC慢10倍以上,STW的时间更长。
  • 如果Major GC后,内存还不足,则会产生OOM异常。

(2)Full GC触发时机

  • 调用System.gc()时,系统建议执行Full GC,但是不一定会执行。
  • 老年代空间不足时
  • 方法区空间不足时
  • 通过Minor GC后进入老年代的平均大小大于老年代的可用内存
  • 由Eden区、survivor space0(From Space)区向survivor space1(To Space)区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小

R 大的回答

二、Full GC的一些问题

2.1 Full GC对程序的影响

Full GC产生的影响主要是:

在发生FULL GC的时候,意味着JVM会安全的暂停所有正在执行的线程(Stop The World),来回收内存空间,在这个时间段内,所有除了回收垃圾的线程外,其他有关JAVA的程序,代码都会静止,反映到系统上,这个过程会导致应用程序暂停执行,造成一定的性能损失和响应延迟。

比如会产生如下的问题:

  • CPU满载告警
  • API响应时间过长
  • 内存反复波动
  • fullgc告警

2.2 如何防止Full GC

《深入理解JVM虚拟机》中给出了这样的建议:

控制Full GC频率的关键是老年代的相对稳定,这主要取决于应用中绝大多数对象能否符合“朝生夕灭”的原则,即大多数对象的生存时间不应当太长,尤其是不能有成批量的、长生存时间的大对象产生,这样才能保障老年代空间的稳定。

所以总结下来,在实际的工作中,我们尽量减少短时间内大量对象的产生,比如重复利用的对象我们可以使用单例模式来减少重复创建,尽量保证老年代的稳定。

2.3 如何定位Full GC

线上服务的GC问题,是Java程序非常典型的一类问题,但是对于经验不足的我们来说还是比较难的,所以我带大家一起学习下,如何系统地定位Full GC的问题。

这里给大家推荐一篇实战排查的文章,博主也是通过这篇文章来学习的。

线上服务的Full GC问题排查,看这篇就够了!

大致的步骤就是:

  • 首先查看我们JVM的配置
  • 通过内存分析工具查看老年代的内存变化,排查是内存泄漏还是内存溢出
  • 通过jmp查看内存映射信息
  • 进一步查看dump内存文件进行分析
  • 通过代码分析具体的对象

另外我们一般可以使用一些工具来进行辅助排查问题:

  • jps: 查看本机java进程
  • jstack: 打印线程的栈信息,制作线程dump文件
  • jmap:打印内存映射信息,制作堆dump文件
  • jstat:性能监控工具
  • jhat:内存分析工具,用于解析堆dump文件并以适合人阅读的方式展示出来
  • jconsole: 简易的jvm可视化工具

这些工具主要是可以查看dump映射文件,从而排查到具体的对象,进而我们再结合代码进行检查即可。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法沉淀】最长回文子串

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《数据结构与算法:初学者入门指南》📘&am…

markdown页面宽度放宽

变成以上样式 ------------------------------------------------ 然后最后一行加上 #write{ max-width: 90%; } /* 调整源码正文宽度 */ #typora-source .CodeMirror-lines { max-width: 90%; } /* 调整输出 PDF 文件宽度 */ media print { #write{ max-w…

添加路障-蓝桥杯-DFS

自己另辟蹊径想的新思路 果然好像还是不太行呀 import java.util.Scanner;public class Main {static int T;//样例组数static int n;//矩阵大小static int[] X {0,1,0,-1};static int[] Y {1,0,-1,0};static int[] X1 {1,0,-1,0};static int[] Y1 {0,-1,0,1};static int …

java的参数传递机制(引用类型)

1.除了非引用类型的形参传递,还有引用类型的变量形参传递,但引用类型的形参变量传递与非引用类型是不同的!!! public class MethodDemo2 {public static void main(String[] args) {int[] arr new int[]{10,20,30,9}…

基于PSO粒子群算法的三角形采集堆轨道优化matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 假设一个收集轨道,上面有5个采集堆,这5个采集堆分别被看作一个4*20的矩阵(下面只有4*10),每个模块&…

阿里云一键登录(号码认证服务)

前言 用户登录原来的登录方式如下 1. 手机号验证码 2. 账号密码 运营觉得操作过于复杂, 因此想引入阿里自动登录的逻辑, 也就是号码认证服务,所以才有了这篇问文章 注: 本文只是记录Java端的实现, app端的请自行查询文档实现 官方资料 文档 : 什么是号码认证服务_号码认证服务(…

【数据分享】2000-2022年全国1km分辨率的逐日PM10栅格数据

空气质量数据是在我们日常研究中经常使用的数据!之前我们给大家分享了2000-2022年全国范围逐日的PM2.5栅格数据和2013-2022年全国范围逐日SO2栅格数据(可查看之前的文章获悉详情)。 本次我们给大家带来的是2000-2022年全国范围的逐日的PM10栅…

Vue:自动按需导入element-plus图标

自动导入使用 unplugin-icons 和 unplugin-auto-import 从 iconify 中自动导入任何图标集。 完整vite.config.js参考模板 https://download.csdn.net/download/ruancexiaoming/88928539 导入element-plus图标 命令行安装unplugin-icons pnpm i -D unplugin-icons//没有安装自…

保姆级讲解字符串函数(上篇)

目录 字符分类函数 导图 函数介绍 1.getchar 2. isupper 和 islower 字符转换函数:(toupper , tolower) 与 putchar 字符串函数 导图 string函数的使用和模拟实现 string的使用 求字符串长度 字符串的比较 string函数的模拟实现…

四桥臂三相逆变器动态电压恢复器(DVR)MATLAB仿真

微❤关注“电气仔推送”获得资料(专享优惠) 简介 四桥臂三相逆变器 电路 的一般形式如图 1,为 便于分析 ,将其等效成图所示的电路 。以直流母线电压Ud的 1/2处为参考点 ,逆变器三相和零线相 输 出可等效成…

【FFmpeg】ffmpeg 命令行参数 ⑤ ( 使用 ffmpeg 命令提取 音视频 数据 | 保留封装格式 | 保留编码格式 | 重新编码 )

文章目录 一、使用 ffmpeg 命令提取 音视频 数据1、提取音频数据 - 保留封装格式2、提取视频数据 - 保留封装格式3、提取视频数据 - 保留编码格式4、提取视频数据 - 重新编码5、提取音频数据 - 保留编码格式6、提取音频数据 - 重新编码 一、使用 ffmpeg 命令提取 音视频 数据 1…

全网最最最详细centos7如何安装docker教程

在CentOS 7上安装Docker主要包括以下步骤: 1. 卸载旧版本的Docker 首先,需要确保系统上没有安装旧版本的Docker。可以通过以下命令来卸载它们: sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-late…