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

相关文章

故障定位快人一步! 华为交换机排障命令汇总

《故障定位快人一步!华为交换机排障命令汇总》在使用华为交换机进行故障排查时,首先需要了解交换机的当前状态,通过执行基础命令,可以迅速获取到交换机的系统信息、接口状态以及配置情况等关键数据,为后续的故... 目录基础系统诊断接口与链路诊断L2切换排障L3路由与转发高级调试与日志性能、安全与扩展IT人无数次实战

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

怎样通过分析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.问题出现原因各