Metaspace内存溢出排查思路、定位、工具与解决

Metaspace内存溢出排查思路、定位、工具与解决

背景:线上项目,每天约50w笔交易请求,每隔两周需要重启一次,发生过几次cpu飙升,无响应的情况。

故障分析:

1.首先排查cpu飙升的原因,根据cat定位cpu飙升开始阶段存在大量gc情况(每分钟7w次),初步定位内存泄露。

2.排查应用日志里oom 类似日志,发现爆 metaspace 溢出。

3.因故障后第一时间进行了重启,并未dump日志,第一时间无法分析

4.事后第三天使用dump内存(/app/jdk1.8.0_121/bin/jmap -dump:format=b,file=1.dump 54),并使用jvisualvm工具对内存对象进行排查。排查思路:寻找数量很多但没有实例的class。

发现存在大量:com.xxx.yyy.credit.biz.common.Item$JaxbAccessorM_getValue_setValue_java_lang_String 而且实例数为0

 

根据代码定位为工具类引起,如下红色部分代码,每次调用都生成新的instance。

public static String convertToXml(Object obj, String encoding) {
    String result = null;
    try {
        JAXBContext context = JAXBContext.newInstance(obj.getClass());
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);

        StringWriter writer = new StringWriter();
        marshaller.marshal(obj, writer);
        result = writer.toString();
    } catch (Exception e) {
        log.error("转换为xml异常", e);
    }
    return result;
}

5.修复验证,修复并做压测,观察metaspace持续无增涨。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值