Java OOM毫无疑问是开发人员常见并且及其痛恨的问题,但是任何服务的开发都没法避免OOM。因此,OOM的排查及定位是每个Java工程师都必备的技能。

所遇到的问题

在使用scala开发的一个web服务,在用户使用中,经常出现:java.lang.OutOfMemoryError: Java heap space。而且还束手无策,每次都只能重启服务解决。

准备

服务使用jetty发布的,先来看一下我这个服务的启动参数:

/opt/soft/jdk/jdk1.7.0_40/bin/java \-server -Xmx4G -XX:MaxPermSize=1024M -XX:PermSize=256M \-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:-CMSConcurrentMTEnabled -XX:CMSInitiatingOccupancyFraction=65 -XX:+CMSParallelRemarkEnabled \-XX:+HeapDumpOnOutOfMemoryError \-XX:HeapDumpPath=/opt/soft/heapdump/ \-Dscala.concurrent.context.numThreads=500 \-Dscala.concurrent.context.maxThreads=500 \-Dfile.encoding=UTF-8 -jar start.jar >> log 2>&1 &

排查

增加通过了参数-XX:+HeapDumpOnOutOfMemoryError状语从句:-XX:HeapDumpPath当在OOM的时候,会服务在/opt/soft/heapdump下生成一个java_pid$pid.hprof二进制文件。

这个java_pid$pid.hprof也可通过jmap命令来即时生成:jmap -dump:format=b,file=java_pid$pid.hprof $pid($ pid为java进程ID)

下面就是使用工具分析这个.hprof文件来定位问题了。使用Memory Analyzer(MAT)来分析该文件,效果如下:


效果很吓人,什么鬼,什么东西,吃了3.8G的内存,我#%KaTeX parse error: Double superscript at position 9: #@#@#&^&^̲&# …
打开泄漏嫌疑人»泄漏»问题可疑1看到如下详情:

一开始可能没那么快找到问题,但是这个图已经很明显说明了问题,的英文ArrayList的内容太大,沾满了内存。但是你可能还不清楚具体那块代码导致,时候这个你可以点击那个ArrayList在左侧栏看Attribute
然后一直鼠标右键into进去看里面的详情,最终是可以看内容的。

问题原因
问题排查到最后,ArrayList看到的是里面存的全是ResponseBodyPart,然后就想到了项目使用到Dispatch请求下载结果文件,
于是乎去找到问题代码,错误代码如下:

val outputReq = dispatch.url(url) / "task" / "output" / id
val outputFuture = Http(outputReq > { res =>val out = new FileOutputStream(outputFile(taskId), true)IOUtils.copy(res.getResponseBodyAsStream(), out)out.close
})

看不出问题,感觉一切正常。翻源码会发现,res.getResponseBodyAsStream()之前,将已经所有内容都存入一个ArrayList当中了。哎,没用对啊。

解决办法

问题已经定位到,于是去了解了一下这个项目,该如何使用stream的方式来读取并写入文件流。然后发现,人家有一个逐行读取的实现。但是切割上其实是有问题的,因为拿到一批bytes之后,直接转成了string并用分隔符分割,
奈何内容里面有中文,出现乱码了。

最终,参考项目本身的as.stream.Lines写了一个as.stream.Bytes来通过bytes边读边写,如下:

val bos = new BufferedOutputStream(new FileOutputStream("/tmp/file.txt", true))
val outputFuture = Http(outputReq > as.stream.Bytes(bytes => {bos.write(bytes)
}))

总结

主要描述了分析问题的思路和方向,问题都大同小异,OOM总会有原因的,有原因肯定可以找到并解决.MAT这个分析工具很实用,内容很详细。以前遇到OOM问题都是重启服务,治标不治本,还是要多分析问题并解决。

(想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程等待你来学习。完全免费哦! )

Java内存溢出排查(必看)相关推荐

  1. 【Java内存溢出排查】gc监测以及内存突增问题排查

    前情提要 文档:[Java内存溢出排查]测试环境服务器挂... 链接:http://note.youdao.com/noteshare?id=783e7ec89950f4167867ef3ef3347 ...

  2. java内存溢出排查jstack_Java命令行监控工具(jmap,jstack,jstat,jinfo,jps)

    项目部署上线之后,线上项目是不能轻易修改的,定位问题的难度也会变大.因此监控是非常重要的一个环节,有了监控,我们才能更好的定位系统中的问题,从而排查.监控的工具有很多种, 但是java自带的命令行监控 ...

  3. java内存溢出排查top_process-parse-shell

    process-parse-shell 介绍 cpu 和 内存异常排查分析shell脚本和步骤 比如用于排查高cpu(top,jstack)和内存溢出等情况 安装教程 使用说明 cpu排查分析 #下载 ...

  4. linux下Java内存溢出排查

    1.查询gc情况(每1秒钟打印一次gc情况) jstat -gcutil pid 1000:1 查询结果含义: S0:幸存区1占用率 S1:幸存区2占用率 E:Eden区占用率 O:老年区占用率 M: ...

  5. java内存溢出 栈溢出的原因与排查方法

    java内存溢出 原因与排查方法 1. 内存溢出的原因是什么? 内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,导致剩余的内存不够用,造成的内存溢出.如果出现这种现象可行代码排查: 一 ...

  6. Java 内存溢出(一)原因、复现、排查

    目录 一.内存溢出原因 二.内存溢出实例 1.堆溢出 2.虚拟机栈和本地方法栈溢出 3.方法区和运行时常量池溢出 4.本机直接内存溢出 三.内存溢出排查 内存溢出: 是指应用系统中存在无法回收的内存或 ...

  7. Java内存溢出问题排查分析

    目录 前言 一.MAT(Memory Analyzer Tool) 二.软件初识 三.捕获dump文件 1.主动方式 2.被动方式 四.分析dump文件 总结 前言 项目运行过程中,我们可能会遇到Ja ...

  8. Java内存溢出分析

    内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是可以知道在什么时候或是在什么操作步骤上出现了异常,而且根据堆栈信息也很容易定位到程序中是某处出现了问题.内存溢出与锁表则不然,一 ...

  9. 一次恐怖的 Java 内存泄漏排查实战

    转载自  一次恐怖的 Java 内存泄漏排查实战 最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>(第二版)这本书,理论+实践结合,深入浅出,强烈推荐给大家. 这两天对JVM内 ...

最新文章

  1. Android 中一些常用类的常用方法(Math、Random、Color、Paint、Canvas、Bitmap、BitmapFactory)...
  2. api 获取网络使用情况_您的API是什么情况?
  3. 智能卡门禁管理系统_出入口门禁控制系统与消防火灾报警系统怎么联动?
  4. 基于JavaWeb实现的研究室综合系统
  5. python语言开发平台_Go+Python双语言混合开发
  6. 蓝宝石rx580怎么超频_台式机显卡怎么选?小百科教你准确定位合理选择(3)
  7. 不要运行explorer_在Internet Explorer浏览器上运行测试
  8. JAVA操作文件大全(一)
  9. opencv数据的读取
  10. 常见的网络协议\端口号
  11. 向日葵显示不能连接服务器,手机向日葵远程连接服务器
  12. 知识付费垂直细分-育儿知识付费社区
  13. 算法---找出数组中的所有孤独数字(Kotlin)
  14. ADS(Advanced Design system)良率分析(Yield)、良率优化(YieldOptim)
  15. 仿ios相机apk_仿苹果相机下载
  16. 编程:随机生成1-100之间的数字,如果猜对了结束游戏,如果猜错则继续猜并提示所猜测的数字是大于还是小于所指定的数,最终提示猜对所用的次数。
  17. 用计算机画有常数的函数图像,信息技术应用 用计算机画函数图象教学内容
  18. SparkMLib决策树和逻辑斯蒂回归的示例
  19. oj趣味题:柱状图排序
  20. 目标检测之详解yolov3的anchor、置信度和类别概率

热门文章

  1. JAVA基础-06.集合-14.【List、Set】
  2. 编写一个学生和教师数据的输入和显示程序,学生数据有编号、姓名、班号和成绩,教师数据有编号、姓名、职称和部门
  3. 文本分类模型学习笔记
  4. 【软件工程】第一、二章总结
  5. 正则表达式之小工具系列
  6. qca9882 qca9880移植
  7. 使用vscode remote ssh功能远程连接服务器或树莓派时,报错Setting up SSH tunnel的终极解决办法,全网仅此一份
  8. XCP协议和A2L文件–A2L(ASAP2)解析
  9. docker实战学习2022版本(七)之docker网络学习
  10. 渗透学习日记day5