当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/126500.html

相关文章:

  • vue+java实现在线播放mp4视频
  • 手机两个卡槽的正确使用方法,您用对了吗?
  • PyTorch翻译官网教程-NLP FROM SCRATCH: CLASSIFYING NAMES WITH A CHARACTER-LEVEL RNN
  • 基于注意力神经网络的深度强化学习探索方法:ARiADNE
  • Martin_DHCP_V3.0 (DHCP自动化泛洪攻击GUI)
  • vscode vue3+vite 配置eslint
  • 【C++学习手札】一文带你初识运算符重载
  • javaScript:数组检测
  • 【JavaEE基础学习打卡02】是时候了解Java EE了!
  • LeetCode 2813. Maximum Elegance of a K-Length Subsequence【反悔贪心】2582
  • 日常BUG——SpringBoot模糊映射
  • Docker 镜像
  • Python发送QQ邮件
  • 梯度下降求极值,机器学习深度学习
  • 【业务功能篇62】Spring boot maven多模块打包时子模块报错问题
  • 【BASH】回顾与知识点梳理(二十一)
  • 从针尖对麦芒,到丝滑入扣,记录那些BT需求
  • 封装vue2局部组件都要注意什么
  • 【深入浅出程序设计竞赛(基础篇)第三章 算法从0开始】
  • 安全之安全(security²)博客目录导读
  • ubuntu安装opencv4
  • Qt 当磁盘可用空间小于指定大小时删除早期的文件
  • 浙大数据结构第七周之07-图6 旅游规划
  • RocketMQ双主双从同步集群部署
  • 分类预测 | MATLAB实现EVO-CNN多输入分类预测
  • DAY04_SpringMVC—SpringMVC简介PostMan和ApiFox工具使用SpringMVC请求与响应REST风格
  • phpstorm配置ftp同步文件到服务器
  • 前端jd要求:了解一门后端开发语言优先 解决方案之Node.js
  • 什么是ServiceMesh(Istio一)
  • 【腾讯云 Cloud Studio 实战训练营】Hexo 框架 Butterfly 主题搭建个人博客