记一次javaMetaspace导致CPU200%的排查

这篇具有很好参考价值的文章主要介绍了记一次javaMetaspace导致CPU200%的排查。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、场景

insertMotionDataByWxCallBack方法并发多(其实也没多少,可能就3个?)就导致CPU200%了,本地没法复现。
看报错是:java.lang.OutOfMemoryError: Metaspace,刚开始的时候眼挫,忽略了后面的Metaspace,只看到了OutOfMemoryError,就各种找代码问题。

2、装arthas

https://arthas.aliyun.com/doc/install-detail.html

cd /opt/apps/arthas/
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
选择进程
dashboard
# 查看top3的进程号
thread -n 3
  • 然后发现,当cpu200的时候,根据挂载不上arthas
  • 建议用:https://club.kdcloud.com/article/180683020100514560?productLineId=29
top -b -d2 -n3 -H -p 1 | grep 'top -' -A 17 > slow.log && jstack -l 1 >> slow1.log
  • 然后下载下来搜索进程号
  • 然后发现没什么用(可能是我不会用?)如果真的要用top+jstack,一定要谨慎谨慎谨慎,我把机器搞崩了,你没听错,是机器,不是java进程,机器直接挂了,ping ip都ping不通,只好断电重启,后面分析系统日志,是内存爆了

3、分析代码

  • 没去找Metaspace的问题,而去找代码了,没想到还真找到一个问题,但是cpu200不是这个引起的,这里也记一下
  • 分析了一通代码后,发现可能是文件流没关的原因:
  • 原始代码如下:
motionApprovalReturnVO.getFileMap()如下:
private Map<String, InputStream> fileMap = new HashMap<>();


List<ContentValue.File> files = content.getValue().getFiles();
if (CollectionUtils.isNotEmpty(files)) {
    List<String> fileIds = files.stream().map(ContentValue.File::getFileId).collect(Collectors.toList());
    fileIds.forEach(fileId -> {
        try {
            File download = cpService.getMediaService().download(fileId);
            motionApprovalReturnVO.getFileMap().put(download.getName(), new FileInputStream(download));
        } catch (Exception e) {
            LOGGER.info("getMediaService download:media_id:{} 下载失败", fileId);
        }

    });
}
  • 在后面调用alioss上传也没有close资源
private List<ILabAttachment> pullWxFile2Oss(Map<String, InputStream> fileMap) {
    if (MapUtils.isEmpty(fileMap)) {
        return new ArrayList<>();
    }
    Map<String, String> fileUrls = ossService.uploadByStream(fileMap);
    return buildILabAttachment(fileUrls);
}

private List<ILabAttachment> buildILabAttachment(Map<String, String> fileUrls) {
    if (MapUtils.isEmpty(fileUrls)) {
        return new ArrayList<>();
    }
    List<ILabAttachment> iLabAttachments = new ArrayList<>();
    fileUrls.forEach((fileName, url) -> {
        ILabAttachment iLabAttachment = new ILabAttachment();
        iLabAttachment.setName(fileName);
        iLabAttachment.setUrl(url);
        iLabAttachments.add(iLabAttachment);
    });
    return iLabAttachments;
}
  • 原本是想着批量上传能快一点,好心办坏事,忽略了close FileInputStream
  • 修改一下代码:
List<ContentValue.File> files = content.getValue().getFiles();
if (CollectionUtils.isNotEmpty(files)) {
    List<String> fileIds = files.stream().map(ContentValue.File::getFileId).collect(Collectors.toList());
    fileIds.forEach(fileId -> {
        try {
            File download = cpService.getMediaService().download(fileId);
            try (FileInputStream inputStream = new FileInputStream(download)) {
                // 处理文件流
                String fileOssUrl = ossService.uploadByStream(inputStream, download.getName());
                motionApprovalReturnVO.getFileUrlMap().put(download.getName(), fileOssUrl);
                download.delete();
            } catch (IOException e) {
                // 异常处理
                LOGGER.error("try (FileInputStream inputStream = new FileInputStream(download)) error");
            }
        } catch (Exception e) {
            LOGGER.error("getMediaService download:media_id:{} 下载失败", fileId);
        }

    });
}
  • 用java7中的try-with-resource 语法来自动释放
  • 然后发现依然不是这里的问题,如果是文件导致的不应该是java.lang.OutOfMemoryError: Metaspace

4、罪魁祸首

  • 后来本地 用VisualVM监控了下程序,发现Metaspace有70M了,而服务器上jvm启动参数只有64M!!!!!!
  • 原来的
-XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m

修改后

-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m
  • 真实奇耻大辱,下次眼睛还是认真一点看吧

end.文章来源地址https://www.toymoban.com/news/detail-423039.html

到了这里,关于记一次javaMetaspace导致CPU200%的排查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记一次线上BUG排查过程

    1. 线上遇到一个非常奇怪的bug,为一个用户分配业务线类型后,该用户登录时,提示502,但其它的用户登录完全是正常的 2. 问题现象 3. 排查思路 先去看线上日志,看是否有error,但日志里边这个接口200正常返回 本地debug,也复现一样问题,在分配角色类型超过22个总数时就报

    2024年02月09日
    浏览(52)
  • 记一次kafka消息积压的排查

    kafka消息积压报警,首先进行了自查,这个现象频频出现,之前每次都是先重新分配分区或者回溯(消息可丢弃防止大量积压消费跟不上)。 根据手册首先排查下消息拉取是否正常,看到了消息拉取线程是waiting状态,然后看到kafka这块逻辑是消费线程阻塞了拉取线程。 对比了

    2024年03月24日
    浏览(54)
  • 记一次Nacos线程数飙升排查

    近日有个项目用到了Nacos做注册中心。运行一段时间发现Nacos服务的线程数达到了1k+。这肯定是不正常的。 环境: 镜像nacos-server 2.2.3 docker-compose编排部署 Nacos standalone模式 问题表现 docker stats nacos 发现该容器的线程数1k+ 用Fastthread分析stack文件表现如下 数量最多的线程线程栈如

    2024年02月09日
    浏览(46)
  • 记一次docker启动失败的问题排查

    以前在虚拟机上安装了一个docker,可以正常使用的,今天突然宿主机机器内存条坏了,换了内存条后启动机器,再使用 systemctrl start docker 启动docker,最后使用 docker start containID 启动报错 网上没有找到相应的描述,仔细分析看是 write /proc/sys/kernel/shmmni 报错了,错误原因是 in

    2024年02月14日
    浏览(64)
  • 记一次Apache HTTP Client问题排查

    通过日志查看,存在两种异常情况。 第一种:开始的时候HTTP请求会报超时异常。 762663363 [2023-07-21 06:04:25] [executor-64] ERROR - com.xxl.CucmTool - CucmTool|sendRisPortSoap error,url:https://xxxxxx/realtimeservice/services/RisPort org.apache.http.conn.HttpHostConnectException: Connect to xxx [/xxx] failed: 连接超时 第二种

    2024年02月12日
    浏览(64)
  • 🔥🔥网络之谜:记一次失败排查的故事

    在这篇文章中,我们将详细探讨导致故障的可能原因以及解决方案,以便更好地理解故障排查的复杂性和艰巨性,尤其是当出现与本次故障表现相似的问题时。 首先,让我们回顾一下故障的表现。在客户端调用接口时,发现一直在转圈等待,而服务器端却收到了请求并在返回

    2024年02月05日
    浏览(56)
  • 记一次Native memory leak排查过程

    路由计算服务是路由系统的核心服务,负责运单路由计划的计算以及实操与计划的匹配。在运维过程中,发现在长期不重启的情况下,有TP99缓慢爬坡的现象。此外,在每周例行调度的试算过程中,能明显看到内存的上涨。以下截图为这两个异常情况的监控。 TP99爬坡 内存爬坡

    2024年02月11日
    浏览(46)
  • 记一次jedis连接池顽固问题排查与修改

    这辈子不想再看到jedisBrokenPipe!!   测试环境运行16天后报错信息: 05:42:32.629 [http-nio-8093-exec-2] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - [log,175] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is redis.clients.jedis.exceptions.JedisCon

    2023年04月21日
    浏览(61)
  • 记一次Elasticsearch GeoIpDownloader的启动异常排查过程

    最近碰到了Elasticsearch GeoIpDownloader相关的一个异常,花费了不少精力排查,故此记录一下,希望碰到同样问题的童鞋们少走弯路。 这个异常是在Elasticsearch启动的过程中报的error,如下所示,从提示信息来看是因为GeoIpDownloader更新数据库失败导致。 GeoIpDownloader是用于下载地图数

    2024年02月02日
    浏览(43)
  • 记一次.Net Core程序启动失败的排查过程

    阅文时长 | 2分钟 字数统计 | 3212字符 主要内容 | 1、引言背景 2、排查.NetCore启动失败详细过程 3、声明与参考资料 『记一次.Net Core程序启动失败的排查过程』 编写人 | SCscHero 编写时间 | 2021/12/23 PM2:6 文章类型 | 系列 完成度 | 已完成 座右铭 每一个伟大的事业,都有一个微不足

    2024年02月05日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包