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

相关文章

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

SpringBoot中的404错误:原因、影响及解决策略

《SpringBoot中的404错误:原因、影响及解决策略》本文详细介绍了SpringBoot中404错误的出现原因、影响以及处理策略,404错误常见于URL路径错误、控制器配置问题、静态资源配置错误... 目录Spring Boot中的404错误:原因、影响及处理策略404错误的出现原因1. URL路径错

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6