某个线上的应用运行几天后,总是出现卡死甚至出现OOM的情况。
注:文中图片可能与描述不符,仅作为演示!

通过Linux的top命令查看cpu占比

首先通过top命令查看,发现某个java程序占用了较高内存:

JDK的jps命令确定是哪个java程序

然后通过jps -l 与上面的PID列(2848)比较,确定是 picasso-java-v1.jar 这个java程序占用cpu过高:

通过ps 查看具体哪个JVM线程

当时想的是可能应用内某个线程导致死循环,使用如下命令查看2848进程的各个线程小号cpu时间

//ps -mp [线程号] -o THREAD,tid,time
ps -mp 2848 -o THREAD,tid,time

下图 %CPU列 为 cpu的百分比,TID列线程id

找到消耗cpu最大的线程(当时线上出现时某个线程消耗cpu90%多),这里为了演示,所以取2858这个线程

通过jstack查看java中的具体线程栈信息

然后把上面线程id转化为16进制,在shell中使用printf "%x\n" tid即可,结果为b2a:

然后使用jstack输出这个线程的调用栈:

//jstack [进程id] | grep [线程的16进制id] -A行数
jstack 2848 | grep b2a -A30


发现为GC线程,原来是jvm内存回收导致的cpu过高!

通过jstat查看内存回收情况

使用jstat -gcutil 线程数 间隔秒数 次数命令查看:

如图上面的FGC列Full GC次数为几百,而FGCT的Full GC秒数达到了几千,通过设置更多的监控次数观察,每次Full GC过后,O列的老年代还是99%,可见是内存不足导致的一直不停Full GC !

重启程序,使用-Xmx -Xms设置更大堆内存

通过重启程序,-Xmx2048m -Xms2048m 设置了更大的内存参数,缓解了问题!

问题重现,寻找其他原因,使用jmap生成堆转储文件

隔了几天后,问题重现,此时通过jmap 生成了镜像

jmap -dump:format=b,file=dumpfile.dat [pid]

生成的文件也是非常之大,达到2.1Gb!

柳暗花明,使用Eclipse Memory Analyzer分析出原因

把dump文件下载到本地,同时下载了Eclipse Memory Analyzer对dump文件进行分析。

在Eclipse Memory Analyzer中生成Leak Suspects报告:

发现是 PoolingHttpClientConnectionManager 这个类导致的。再点击上图中的Details,查看详细信息:

这下清晰了,是阿里的oss类库导致的,结合程序中的如下代码:

OSSClient ossClient = new OSSClient("","");
PutObjectResult putObjectResult = ossClient.putObject("", "", "");

这个方法在程序中没有使用单例模式而且没有关闭,每调用一次就生成了一个PoolingHttpClientConnectionManager,而且是不可回收的。通过源码查看到IdleConnectionReaper.size()这个类会生成PoolingHttpClientConnectionManager的总数量。

验证猜测

使用 -Xms20m -Xmx20m 运行以下程序,发现size一直变大,最后导致OOM (java.lang.OutOfMemoryError)

for (int i = 0; i < 60000; i++) {OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);ossClient.putObject("<test-bucket>", "test1234" + UUID.randomUUID(), new File("d:/file.txt"));System.out.println("size="+IdleConnectionReaper.size());Thread.sleep(2);
}

查看api,得知使用shutdown方法即可关闭OSSClient:

ossClient.shutdown();

再运行以下程序,size一直为0,一切正常:

for (int i = 0; i < 60000; i++) {OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);ossClient.putObject("<test-bucket>", "test1234" + UUID.randomUUID(), new File("d:/file.txt"));ossClient.shutdown();System.out.println("size="+IdleConnectionReaper.size());Thread.sleep(2);
}

至此,终于找到了导致cpu过高和OutOfMemoryError的真凶!

分享一次解决线上java应用导致JVM内存溢出(OOM)的问题相关推荐

  1. 一位面试官询问我:Java中的JVM内存溢出和内存泄露是什么?我这么回答成功拿到了offer

    一位面试官询问我:Java中的JVM内存溢出和内存泄露是什么?我这么回答成功拿到了offer. 墨眉无锋墨家代码 2020-11-22 20:16:50 10525 收藏 56 分类专栏: Java ...

  2. 记一次线上Java程序导致服务器CPU占用率过高的问题排除过程

    1.故障现象 客服同事反馈平台系统运行缓慢,网页卡顿严重,多次重启系统后问题依然存在,使用top命令查看服务器情况,发现CPU占用率过高. 2.CPU占用过高问题定位 2.1.定位问题进程 使用top ...

  3. java 大数据处理之内存溢出解决办法

    因项目中需要查询大量数据,所以导致jvm内存溢出,发现这篇博文不错,转发来共同学习 原文地址:https://www.cnblogs.com/a757956132/p/4644910.html 一.内 ...

  4. 怎么解决线上CPU100%的问题

    怎么解决线上CPU100%的问题 背景 Java服务,有时候会遇到CPU 100%的问题,对于这样的问题,我们如何快速定位并解决呢?一般会有如下几个步骤. 解决步骤 找到最耗CPU的进程 top 找到 ...

  5. 听说”双11”是这么解决线上bug的

    听说"双11"是这么解决线上bug的 --Android线上热修复的使用与原理 预备知识和开发环境 Android NDK编程 AndFix浅析 Android线上热修复的原理大同 ...

  6. 线上Java 高CPU占用、高内存占用排查思路

    一.前言 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题.当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警.本文主要针对系统 ...

  7. iOS app崩溃率,如何解决线上闪退

    //联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄 1.如何追踪app崩溃率,如何解决线上闪退 当iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.cra ...

  8. c语言二级闪退有分数嘛,c语言文件1.怎样追踪app崩溃率。怎样解决线上闪退 当iO(2)...

    市场上已有的商业软件提供crash收集服务,这些软件基本都提供了日志存储,日志符号化解析和服务端可视化管理等服务: Crashlytics () Crittercism () Bugsense () ...

  9. 线上 4 台机器同一时间全部 OOM,到底发生了什么?

    点击上方 好好学java ,选择 星标 公众号重磅资讯.干货,第一时间送达 今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W+访问量博客:点 ...

最新文章

  1. 更改git bash默认的路径
  2. hdu 5067(状态压缩dp)
  3. python url编码 空格_使用请求和python时URL中的空格
  4. Linux下文件的多进程拷贝
  5. 下个十年的 C 位:物联网趋势大剧透
  6. Bootstrap 滚动监听Scrollspy 调用方式
  7. Java基础学习总结(82)——Java泛型实例教程
  8. ZOJ 3983 2017CCPC秦皇岛 C:Crusaders Quest
  9. python学习之继承
  10. 2022下半年软件设计师资源分享
  11. 【Chrome】如何对Chrome浏览器内容进行长截图
  12. nuxt项目添加百度统计的代码
  13. 微型计算机与接口技术总结,微机原理与接口技术课程总结
  14. bugly热更新,提交补丁时提示未匹配到可应用补丁包的APP版本,请确认补丁包的基线版本是否配置正确
  15. 红米note5系统Android11,红米Note5 MIUI11 解账户锁 可登小米账号 永不反锁 完美ROOT 解锁包...
  16. 二类电商积分商城,积分兑换商城源码,免登陆积分兑换商城系统
  17. 台积电创始人张忠谋:英特尔不会重回巅峰;马斯克加入“催生”大军;2021国民年度十大流行语 | EA周报...
  18. ChucK初步(7)
  19. dz程序上传服务器的位置,dz手机端上传到远程服务器
  20. 荣耀手环6太带劲 大屏时代终来临

热门文章

  1. 蓝湖导出android代码,蓝湖一键生成整页代码,帮开发留住头发
  2. 【投影仪】投影仪相关知识及参数科普
  3. 创建多线程的几种方法介绍
  4. 【计算机系统要素】使用Nand实现各种基本逻辑门
  5. SpringCloud(五)- GateWay简介及GlobalFilter 过滤器的使用
  6. 挑战UnityShader学习之三_工欲善其事必先利其器Standard面板详细解析和代码自定义
  7. 路西法效应_百度百科
  8. 鲸探发布点评:9月19日发售《中国大飞机C919》数字藏品
  9. 结构化开发方法和面向对象开发方法的比较
  10. Unsupervised person re‑identification via K‑reciprocal encoding and style transfer