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后进行本地调试,单步调试的时候当类加载器加载类的时候就会把信息打印到控制台中,这样就可以一步一步定位到哪里加载的了

相关推荐
Haooog38 分钟前
Java 面向对象详解和JVM底层内存分析
java·jvm
蚰蜒螟4 小时前
深入解析JVM字节码解释器执行流程(OpenJDK 17源码实现)
开发语言·jvm·python
头发那是一根不剩了7 小时前
怎么用idea分析hprof文件定位JVM内存问题
java·jvm
20242817李臻8 小时前
20242817-李臻-课下作业:Qt和Sqlite
jvm·qt·sqlite
python算法(魔法师版)8 小时前
.NET NativeAOT 指南
java·大数据·linux·jvm·.net
Excuse_lighttime9 小时前
JVM 机制
java·linux·jvm
蚰蜒螟11 小时前
jvm安全点(二)openjdk17 c++源码垃圾回收安全点信号函数处理线程阻塞
jvm·安全
DBWYX1 天前
JVM 精华
jvm
jiedaodezhuti2 天前
为什么elasticsearch配置文件JVM配置31G最佳
大数据·jvm·elasticsearch
进击的雷神2 天前
数据库知识全面考查:从基础概念到实战应用
jvm·数据库·oracle