FullGC的Demo与原因定位

2024-02-26 12:32
文章标签 定位 原因 demo fullgc

本文主要是介绍FullGC的Demo与原因定位,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作为平台开发人员,经常要为用户定位应用(如Flink、Spark等)的线上问题,出现频率较高的就是任务实现问题,出现FullGC,从而导致数据处理速度下降或是OOM等问题,下面简单记录、分享下定位过程。

内容如下:

  1. Main方法,复现FullGC场景
  2. 定位FullGC的步骤

Main方法,复现FullGC场景

无论是Flink、Spark还是web应用,都会有GC监控或日志打印(Gc日志参数控制),一旦出现,就需要排查原因,定位哪个对象太大,导致FullGC太频繁。
下面的Main可以直接运行,运行过程中会不断在堆内存中创建Person对象,触发FullGC:

package com.wj.jvm.gc;import java.util.ArrayList;
import java.util.List;/*** 引发FullGC** @author wj*/
public class FullGC {private static long counter = 0;private static List<Object> list = new ArrayList<>();public static void main(String[] args) {int availableProcessors = Runtime.getRuntime().availableProcessors();for (int i = 0; i < availableProcessors; i++) {new Thread(() -> {while (true) {list.add(Person.newInstance("cmy", 29, "天润城"));list.add(Person.newInstance("wj", 28, "天润城2"));counter += 2;System.out.println("counter : " + counter);}}).start();}}
}class Person {private String name;private Integer age;private String address;private String name2;private Integer age2;private String address2;private Person(String name, Integer age, String address) {this.name = name;this.age = age;this.address = address;}static Object newInstance(String name, Integer age, String address) {Person person = new Person(name, age, address);person.name2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";person.age2 = 33333;person.address2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";return person;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", address='" + address + '\'' +", name2='" + name2 + '\'' +", age2=" + age2 +", address2='" + address2 + '\'' +'}';}
}

参考:

  • FullGC触发条件:https://blog.csdn.net/yuxxz/article/details/89432786
  • Java GC 日志详解(图):https://www.jianshu.com/p/ade514d7c56b

定位FullGC的步骤

1.登录到App所在机器

结合具体的App应用场景,登录到指定机器上,如Flink部署到Yarn上,需要从namenode节点跳转至Container。

2. 找到App进程号

  • 方式一: jps -l
    直接使用java命令,查询当前机器上所有java进程ID
  • 方式二:ps -ef | grep application_1556437712190_212447 | grep -v grep
    根据应用的appId查询进程ID

3.查看GC信息

  • jstat -gcutil -h 20 pid 1000 20000

示例结果如下:

S0     S1     E      O      M     CCS       YGC   YGCT     FGC FGCT     GCT
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    36  187.562  195.246
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    36  187.562  195.246
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    37  192.986  200.670
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    37  192.986  200.670
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    37  192.986  200.670
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    37  192.986  200.670
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    37  192.986  200.670
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    38  198.437  206.121
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    38  198.437  206.121
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    38  198.437  206.121
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    38  198.437  206.121
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    38  198.437  206.121
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    38  198.437  206.121
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    39  203.949  211.633
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    39  203.949  211.633
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    39  203.949  211.633
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    39  203.949  211.633
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    39  203.949  211.633
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    40  209.629  217.313
0.00   0.00 100.00 100.00  94.85  85.10     39    7.684    40  209.629  217.313

每秒输出一次gc状态,从结果可以看出,每5秒左右即出现FGC。

关于jstat -gcutil的指令用法和结果分析可参考:https://blog.csdn.net/zhaozheng7758/article/details/8623549

4.FullFC较为频繁,查看gc的对象

  • jmap -histo:live 6812 | head -10

示例结果如下:

num     #instances         #bytes  class name
----------------------------------------------
1:       9221275      368851000  com.wj.jvm.gc.Person
2:          1083      258508144  [Ljava.lang.Object;
3:       9221531      147544496  java.lang.Integer
4:          6844         728632  [C
5:          6693         160632  java.lang.String

从结果可以看出,导致FGC的大对象就是com.wj.jvm.gc.Person导致的。

关于jmap的用法可以参考:https://www.cnblogs.com/kongzhongqijing/articles/3621163.html

这篇关于FullGC的Demo与原因定位的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/748891

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

SpringSecurity显示用户账号已被锁定的原因及解决方案

《SpringSecurity显示用户账号已被锁定的原因及解决方案》SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNon... 目录SpringSecurity显示用户账号已被锁定的解决方案1.问题出现前的工作2.问题出现原因各

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

CSS Anchor Positioning重新定义锚点定位的时代来临(最新推荐)

《CSSAnchorPositioning重新定义锚点定位的时代来临(最新推荐)》CSSAnchorPositioning是一项仍在草案中的新特性,由Chrome125开始提供原生支持需... 目录 css Anchor Positioning:重新定义「锚定定位」的时代来了! 什么是 Anchor Pos

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

IDEA中Maven Dependencies出现红色波浪线的原因及解决方法

《IDEA中MavenDependencies出现红色波浪线的原因及解决方法》在使用IntelliJIDEA开发Java项目时,尤其是基于Maven的项目,您可能会遇到MavenDependenci... 目录一、问题概述二、解决步骤2.1 检查 Maven 配置2.2 更新 Maven 项目2.3 清理本

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案

《使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案》在SpringBoot应用中,我们经常使用​​@Cacheable​​注解来缓存数据,以提高应用的性能... 目录@Cacheable注解Redis时,Redis宕机或其他原因连不上,继续调用原方法的解决方案1