首页 > 其他分享 >排查full gc

排查full gc

时间:2024-10-22 15:25:35浏览次数:7  
标签:full 分代 Survivor 对象 排查 Full GC gc

GC就是Java的垃圾回收机制,要了解什么情况下会发生GC(即GC得触发条件),我们需要先了解JVM的内存模型结构,之前一篇文章已经详细讲解了Jvm的内存模型结构,而通常来说,GC主要针对的是堆(java heap)区。

而java heap是分代的(年轻代和老年代),为什么要分代?其实也不难理解,分代就是为了优化性能,如果不分代,那就会导致所有对象揉在一块,那样GC就会对堆区域进行全扫描。所以,分代可以大大提升GC性能,那么,分代的原理是什么?

JVM对于堆的垃圾回收,采用分代收集的策略,所以分代的原理就是根据堆中对象的存活周期进行分代,年轻代中,每次垃圾回收都有大批对象死去,只有少量存活,而老年代中存放的对象存活率高。

>>>>>必须知道的知识点<<<<<
Young space:年轻代(新生代),保存生命周期较短的对象

Tenured space:老年代(年老代),保存生命周期较长的对象

Minor GC:发生在Young space中的gc

Major GC:发生在老年代Tenured space中的gc

STW(stop the world):指的是用户线程在运行至安全点(safe point)或安全区域(safe region)之后,就自行挂起,进入暂停状态,对外的表现就是卡顿,而不论何种gc算法,不论是minor gc还是major gc都会STW,区别只在于STW的时间长短。

Full GC:无官方定义,通常意义上而言指的是一次特殊GC的行为描述,这次GC会回收整个堆的内存,包含老年代,新生代,metaspace等。
但是实际情况中,我们主要看的是gc.log日志,其中也会发现在部分gc日志头中也有Full GC字眼,此处表示含义是在这次GC的全过程中,都是STW的状态,也就是说在这次GC的全过程中所有用户线程都是处于暂停的状态。

 

 

>>>>>年轻代<<<<<
Jvm把年轻代分三部分:1个Eden(伊甸园)区和2个Survivor(幸存者)区(分别叫from和to),默认比例为8:1。

为啥默认这个比例?
一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度(默认15岁)时,就会被移动到年老代中。

因为年轻代中的对象基本都是朝生夕死的(80%以上),所以年轻代的垃圾回收算法采用复制算法(内存分为两块,每次只用其中一块,当一块内存用完,就将还活着的对象复制到另外一块内存上,复制算法不产生内存碎片)。在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。

这个时候,“From”和“To”会交换他们的角色,就是新的“To”是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。

总结下来,JVM的堆区对象分配的规则一般如下:
1)对象优先在Eden区分配

2)大对象直接进入老年代(-XX:PretenureSizeThreshold=3145728 该参数来定义进入老年代对象大小)

3)长期存活的对象将进入老年代(在JDK8中-XX:MaxTenuringThreshold=1的阀值设定根本没用)

4)动态对象年龄判定(虚拟机并不会永远地要求对象的年龄都必须达到MaxTenuringThreshold才能晋升老年代,如果Survivor空间中相同年龄的所有对象的大小总和大于Survivor的一半,年龄大于或等于该年龄的对象就可以直接进入老年代)

5)空间分配担保

6)只要老年代的连续空间大于(新生代所有对象的总大小或者历次晋升的平均大小)就会进行minor GC,否则会进行full GC

GC的触发条件
PS:JVM优化的目的就是减少SWT执行的时间(避免卡顿),避免频繁full gc
1)System.gc()方法的调用。
此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full GC的频率,也即增加了间歇性停顿的次数。强烈影响系建议能不使用此方法就别使用,让虚拟机自己去管理它的内存,可通过通过-XX:+ DisableExplicitGC来禁止RMI(Java远程方法调用)调用System.gc。

2)旧生代空间不足。旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出错误:java.lang.OutOfMemoryError: Java heap space 。为避免以上两种状况引起的FullGC,调优时应尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组。

3)Permanet Generation空间满了。Permanet Generation中存放的为一些class的信息等,当系统中要加载的类、反射的类和调用的方法较多时,Permanet Generation可能会被占满,在未配置为采用CMS GC的情况下会执行Full GC。如果经过Full GC仍然回收不了,那么JVM会抛出错误信息:java.lang.OutOfMemoryError: PermGen space 。为避免Perm Gen占满造成Full GC现象,可采用的方法为增大Perm Gen空间或转为使用CMS GC。

4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存

5)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代可用内存不足(老年代可用内存小于该对象)

标签:full,分代,Survivor,对象,排查,Full,GC,gc
From: https://www.cnblogs.com/azwz/p/18492946

相关文章

  • 在华为云服务器上测试GCC for OpenEuler的特性
    步骤1:购买并配置华为云服务器1.1注册华为云账号访问华为云官网:打开浏览器,访问华为云官网。注册账号:点击页面右上角的“注册”按钮。按照提示填写必要的信息(邮箱、密码、验证码等)完成注册。可能需要验证邮箱,请按照邮件中的指示完成验证。1.2登录华为云控制台登录......
  • 记录一次内存泄漏排查
    事件描述order服务出现频繁GC告警,app卡顿事件回顾【2024-10-2108:20:04】order出现频繁GC告警【2024-10-2109:24:04】通过命令jmap-histo:live[pid]查看存活对象发现sentinel统计对象占用大量内存【2024-10-2110:33:04】dump下堆内存信息【2024-10-2110:35:04】版本......
  • springcloud入门-项目搭建
    本文主要供小白使用,详述springcloud项目在实战环境中如何搭建以及常见问题的解决方法,各微服务组件的具体使用及原理,后续我会逐步补充。本文后续论述均以如下环境为前提:jdk:1.8spring-boot:2.6.0spring-cloud:2021.0.9一、公共组件搭建1.parent项目搭建1)pom.xml文......
  • 【重拾算法第一天】质数&&约数&&欧拉筛 埃氏筛&&GCD
    1.素数素数(PrimeNumber)是指大于1的自然数,只有两个正因数:1和它自身。换句话说,素数是不能被其他自然数整除的数。1.1小素数的判定判定一个数是否为素数,当N≤  时,用试除法,当n>  时,用Miller_Rabin算法根据素数的定义,可以直接得到试除法,用[2,n-1]内的所有数着......
  • 【验证码识别专栏】大炮打麻雀 — CLIP 图文多模态模型,人均通杀 AIGC 六、九宫格验证
    前言近期有粉丝私信,不知道如何训练某讯系点选验证码,之前星球群也有不少粉丝讨论相关问题,为满足粉丝们的需求,本文将对这型验证码的训练进行讲解,文末可以下载相关的工具,包括文章配套标注工具+文章配套训练代码+部分学习数据集(少量类目,仅供学习使用,不设计成品)+六宫格推理比......
  • GCN(图卷积神经网络)中的**信息聚合**和传统聚类算法是不同的概念,尽管它们都涉及到将某
    GCN(图卷积神经网络)中的信息聚合和传统聚类算法是不同的概念,尽管它们都涉及到将某些对象的信息整合在一起。下面我将详细解释两者的差异:1.GCN中的信息聚合GCN中的信息聚合过程是节点级别的邻居信息融合,主要目的是通过图的拓扑结构更新节点的特征表示。每个节点通过其邻......
  • oom排查与jvm部门知识
    1)什么是OOM?OOM,全称“OutOfMemory”,翻译成中文就是“内存用完了”,来源于java.lang.OutOfMemoryError。看下关于的官方说明:ThrownwhentheJavaVirtualMachinecannotallocateanobjectbecauseitisoutofmemory,andnomorememorycouldbemadeavailablebyt......
  • 图卷积网络(GCN)基于电网拓扑预测未来一段时间的电力负荷的一些思路
    使用图卷积网络(GCN)基于电网拓扑预测未来一段时间的电力负荷,是一个将深度学习与图结构数据相结合的典型应用。电网天然的图结构让一切变得更好理解了一些。步骤1:问题定义首先我们定义一下当前的目标,既基于电网的拓扑结构和历史负荷数据,利用GCN模型预测未来一段时间各节点的电......
  • 【AIGC】第一性原理下的ChatGPT提示词Prompt设计:系统信息与用户信息的深度融合
    博客主页:[小ᶻZ࿆]本文专栏:AIGC|ChatGPT文章目录......
  • 流量抓包和网络问题排查,网工不要只会Wireshark,用好TCPdump才是大神!
    你好,这里是网络技术联盟站,我是瑞哥。在网络工程师的日常工作中,流量抓包和网络问题的排查是不可或缺的一环。Wireshark作为图形界面强大的流量分析工具,深受众多网络工程师的喜爱。然而,仅仅依赖Wireshark并不足以成为一个真正的网络排查高手。真正的网络大神往往能熟练运......