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

相关文章

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

使用Vue.js报错:ReferenceError: “Vue is not defined“ 的原因与解决方案

《使用Vue.js报错:ReferenceError:“Vueisnotdefined“的原因与解决方案》在前端开发中,ReferenceError:Vueisnotdefined是一个常见... 目录一、错误描述二、错误成因分析三、解决方案1. 检查 vue.js 的引入方式2. 验证 npm 安装3.

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

js定位navigator.geolocation

一、简介   html5为window.navigator提供了geolocation属性,用于获取基于浏览器的当前用户地理位置。   window.navigator.geolocation提供了3个方法分别是: void getCurrentPosition(onSuccess,onError,options);//获取用户当前位置int watchCurrentPosition(

DAY16:什么是慢查询,导致的原因,优化方法 | undo log、redo log、binlog的用处 | MySQL有哪些锁

目录 什么是慢查询,导致的原因,优化方法 undo log、redo log、binlog的用处  MySQL有哪些锁   什么是慢查询,导致的原因,优化方法 数据库查询的执行时间超过指定的超时时间时,就被称为慢查询。 导致的原因: 查询语句比较复杂:查询涉及多个表,包含复杂的连接和子查询,可能导致执行时间较长。查询数据量大:当查询的数据量庞大时,即使查询本身并不复杂,也可能导致

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位 一、背景二、定位问题三、解决方法 一、背景 flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案在博主上面这篇文章的基础上,在机器内存、cpu资源、flume agent资源都足够的情况下,flume agent又出现了tmp文件无法关闭的情况 二、

71-java 导致线程上下文切换的原因

Java中导致线程上下文切换的原因通常包括: 线程时间片用完:当前线程的时间片用完,操作系统将其暂停,并切换到另一个线程。 线程被优先级更高的线程抢占:操作系统根据线程优先级决定运行哪个线程。 线程进入等待状态:如线程执行了sleep(),wait(),join()等操作,使线程进入等待状态或阻塞状态,释放CPU。 线程占用CPU时间过长:如果线程执行了大量的I/O操作,而不是CPU计算