排查一次类加载导致的OOM

问题背景

线上收到异常告警

在这里插入图片描述

查看监控发现应用从启动后metaspace的占用就一直在增长,增长到一定限制后,pod重启

在这里插入图片描述

排查过程

metaspace存储的是类的结构信息,一直在增长基本上是因为类一直被重复加载,无法被卸载掉
给应用加上启动参数

-XX:+TraceClassLoading -XX:+TraceClassUnloading

追踪这个应用在运行过程中类的加载和卸载信息,发现某几个接口运行的过程中会一直加载某个工厂类

[Loaded com.**.***.***.classA_classB_ObjectFactory302966803037648304096626598839$4336 from jar:file:/usr/local/app/app.jar!/BOOT-INF/lib/orika-core-1.5.4.jar!/]

从最后的jar包信息我们知道是orika-core的类,接下来从这几个异常的接口入手,开始看代码,有下面可疑代码

    private void insertMartMaterialMarketCorrelation(classA entity){
        ....
        MapperFacade mapperFacade = new DefaultMapperFactory.Builder().build().getMapperFacade();
        result = mapperFacade.map(entity, classB.class);
        ....
    }

推测可能是每一次请求这两行代码都会反射出一个classA和classB的组合类,且无法被回收,于是把这段代码提到类外面,作为静态资源后解决

public class C{
    static MapperFacade mapperFacade = new DefaultMapperFactory.Builder().build().getMapperFacade();
}

解决后metaspace平稳

在这里插入图片描述

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值