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

相关文章

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

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An