JVM元空间溢出的排除思路

背景:

java的应用我们为了防止元空间的无限扩展,一般都会设置MaxMetaSpace参数,一般来说只要这个值是512M或者1G左右就足够了,不过今天遇到一个meta空间溢出问题,简单记录下排除的思路

meta元空间溢出

最开始的现象是不停的进行fullgc,但是gc后新生代和年老代的大小都不怎么变化,此时应该是因为gc占用了应用的执行,导致此时其实应用很少能产生对象出来了,所以这就是看到fullgc后新生代和老年代不怎么变化的原因,在经过了几十次gc后,发生OOM: metaspace异常,以下记下排除思路:
1.首先使用>jstat -gcutil pid 1000 5

排除下gc的情况,包括此时Meta的空间占用情况
2.由于元空间的数据一般都是分配给类加载器的,我们需要使用命令jmap -clstats pid看一下当前系统中有哪些类加载器:

3.查看类加载器加载的所有类的信息,命令如下jcmd pid GC.class_stats :

关键的信息有加载类的名称(ClassName)、每个类所占据的字节(KlassBytes)、每个类的实例所占据的字节(InstBytes)、每个类中方法的数量(MethodCount)、字节码所占据的空间(ByteCodes)),这里需要重点看的就是有没有重复加载的类,也就是对ClassName去重后统计数量,如果同一个ClassName出现次数超过一次,证明是由不同的类加载器加载的,因为正常来说由于类加载器的双亲委派机制,一个类一般都只是由一个类加载器加载的,所以如果这里一个类有多个类加载器加载,就需要判断下是否是这个类加载器导致的问题了,那么下一步就是找出Class对象对应的类加载器了

4.使用MAT内存分析工具分析Class对象对应的类加载器

选择MAT界面上的Histogram界面,选择有问题的Class实例,然后右键 PATH TO GC ROOT,查看对应的类加载器即可

5.定位是哪一行代码生产的类加载器加载的类

加上JVM 参数:-XX:+UnlockDiagnosticVMOptions后进行本地调试,单步调试的时候当类加载器加载类的时候就会把信息打印到控制台中,这样就可以一步一步定位到哪里加载的了

相关推荐
笨笨饿17 分钟前
# 59_CSDN博客自动写流程文章
linux·jvm·stm32·单片机·嵌入式硬件·mcu·51单片机
tedcloud1231 小时前
Docker Compose 部署 Memos:从安装到备份恢复
linux·开发语言·jvm·后端·docker·容器·rust
螺蛳粉 螺蛳粉2 小时前
大数据第四篇:事故复盘:移走 HBase 里 27 个 hadoop-2.10.2 jar 后,HMaster 半小时后“自杀“了【jar 事故复盘】
jvm·hadoop·hbase·异常处理·大数据运维·踩坑记录·事故复盘
wuminyu3 小时前
JVM规范学习总结-JVM规范基本概念
java·linux·c语言·jvm·c++
学到老活到老18 小时前
方法执行完了,对象为什么还占着内存?
java·jvm
骑着蜗牛撵大象3271 天前
四种库收进一个SQL编辑器(下):跨库取数、方言对齐与四库巡检的落地拆解
jvm·数据库·sql·编辑器·数据迁移·跨库查询
需要8262 天前
容器化 Java:镜像瘦身与 JVM 容器感知(cgroup)
java·开发语言·jvm
Pniubi2 天前
ConcurrentHashMap拆分线程池难点再讲
java·jvm
Irene19913 天前
Flink 学习日志 01:前端转大数据的实战避坑指南
java·jvm·flink
小天源4 天前
从 Nginx 日志到访问分析:轻量化网站监测服务的架构实践
jvm·nginx·网络安全·架构·网络监控