Java服务,内存OOM问题如何快速定位?

原创作者: 58沈剑  来自公众号:架构师之路

最近有朋友在知识星球提问:
沈老师,有一个Java服务出现了OOM(Out Of Memory)问题,定位了好久不得其法,请问有什么好的思路么?
OOM的问题,印象中之前写过,这里再总结一些相对通用的方案,希望能帮助到Java技术栈的同学。

某Java服务(假设PID=10765)出现了OOM,最常见的原因为:

  • 有可能是内存分配确实过小,而正常业务使用了大量内存

  • 某一个对象被频繁申请,却没有释放,内存不断泄漏,导致内存耗尽

  • 某一个资源被频繁申请,系统资源耗尽,例如:不断创建线程,不断发起网络连接

画外音:无非“本身资源不够”“申请资源太多”“资源耗尽”几个原因。
 

更具体的,可以使用以下工具逐一排查。

一、确认是不是内存本身就分配过小

方法:jmap -heap 10765

如上图,可以查看新生代,老生代堆内存的分配大小以及使用情况,看是否本身分配过小。

二、找到最耗内存的对象

方法:jmap -histo:live 10765 | more

如上图,输入命令后,会以表格的形式显示存活对象的信息,并按照所占内存大小排序:

  • 实例数

  • 所占内存大小

  • 类名

是不是很直观?对于实例数较多,占用内存大小较多的实例/类,相关的代码就要针对性review了。

上图中占内存最多的对象是RingBufferLogEvent,共占用内存18M,属于正常使用范围。

如果发现某类对象占用内存很大(例如几个G),很可能是类对象创建太多,且一直未释放。例如:

  • 申请完资源后,未调用close()或dispose()释放资源

  • 消费者消费速度慢(或停止消费了),而生产者不断往队列中投递任务,导致队列中任务累积过多

画外音:线上执行该命令会强制执行一次fgc。另外还可以dump内存进行分析。

三、确认是否是资源耗尽

工具:

  • pstree

  • netstat

查看进程创建的线程数,以及网络连接数,如果资源耗尽,也可能出现OOM。

这里介绍另一种方法,通过

  • /proc/${PID}/fd

  • /proc/${PID}/task

可以分别查看句柄详情和线程数。

例如,某一台线上服务器的sshd进程PID是9339,查看

  • ll /proc/9339/fd

  • ll /proc/9339/task

如上图,sshd共占用了四个句柄

  • 0 -> 标准输入

  • 1 -> 标准输出

  • 2 -> 标准错误输出

  • 3 -> socket(容易想到是监听端口)

sshd只有一个主线程PID为9339,并没有多线程。

所以,只要

  • ll /proc/${PID}/fd | wc -l

  • ll /proc/${PID}/task | wc -l (效果等同pstree -p | wc -l)

就能知道进程打开的句柄数和线程数。

希望这1分钟能帮到这位星球水友。

你遇到过奇葩的OOM问题么?是怎么定位的?欢迎分享。

Java服务,内存OOM问题如何快速定位?相关推荐

  1. Java服务,CPU100%问题如何快速定位?

    上篇<Java服务,内存OOM问题如何快速定位?>发布后,有朋友在评论留言,问CPU100%的性能问题,如何找到相关服务,如何定位问题代码,也非常考验技术人的功底,今天简单说下思路. 假设 ...

  2. 42、Java服务内存OOM原因分析

    1.出现问题的可能原因 对于应用来说内存分配太少 对象创建太多,又没有释放,造成内存泄漏严重,导致内存耗尽 申请太多的系统资源,系统资源耗尽.例如:不断创建线程,不断发起网络连接 2.如何定位问题(可 ...

  3. 运维:你们 JAVA 服务内存占用太高,还只增不减!告警了,快来接锅

    先点赞再看,养成好习惯 某天,运维老哥突然找我:"你们的某 JAVA 服务内存占用太高,告警了!GC 后也没释放,内存只增不减,是不是内存泄漏了!" 然后我赶紧看了下监控,一切正常 ...

  4. 通过长期测试定位java服务内存泄漏问题

    目录 一.前言 二.实验说明 三.实验记录 3.1 保存接口-exe部署-pid-1484 3.2 查询接口-exe部署pid-18592 3.3 查询接口-jar部署pid-20048 3.4 服务 ...

  5. JAVA的内存回收机制(快速入门版)

    java内存回收机制 内存回收,是JVM中垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制 引用 : java中什么是引用? Person xiaoi =new ...

  6. java 导致内存泄露的情况_JConsole定位内存泄漏

    在本文中,我们将看到Java中内存泄漏的示例代码.之后,我们将把Java应用程序连接到JConsole,比较有无内存泄漏时应用程序的内存使用情况.深入研究JConsole的内存监控工具可以让我们看到堆 ...

  7. java 100% cpu_Java服务,CPU100%问题如何快速定位?

    假设,服务器上部署了若干Java站点服务,以及若干Java微服务,突然收到运维的CPU异常告警.如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载? 简要步骤如下: ...

  8. java服务内存占用过高

    文章目录 1.查看内存占用高的进程 2.查看对象个数和占用内存大小 3.导出内存镜像 4.安装独立版本的Memory Analyzer工具 5.使用MAT工具进行分析 6.注意 以下代码没有特殊说明, ...

  9. 用“逐步排除”的方法定位Java服务线上“系统性”故障

    说明:原文地址已经不可访问,其他地方有转载,不过很多丢失图片,所以,找到一处有图的重新配好图. 用"逐步排除"的方法定位Java服务线上"系统性"故障 Post ...

最新文章

  1. ajax跨界表单,ajax使用jsonp解决跨域问题
  2. 通俗讲解集成学习算法!
  3. SVD(奇异值分解)+NMF(非负矩阵分解)
  4. NR 5G 测量与寻呼
  5. java 调用word插件_java一键生成word操作,比poi简单
  6. 【HNOI2007】紧急疏散
  7. ASP.NET Core IP 请求频率限制
  8. jsf集成spring_Spring和JSF集成:异常处理
  9. linux mrtg 命令,linux服务器之流量监控(MRTG)
  10. 业内对楼市回暖时间几成共识:尚需一年
  11. openvswitch安装、基本操作
  12. java转换apk软件_jar软件转安卓apk软件
  13. 嵌入式Linux开发简介
  14. 摄影测量空间后方交会python实现
  15. 最优DP转LVDS解决方案|低成本DP to LVDS转换设计|CS5211方案优势
  16. 十大硬盘数据恢复软件介绍
  17. Linux中MISC驱动简介及其简单使用
  18. 最详细的【微信小程序+阿里云Web服务】开发部署指引(三):开通阿里云主机
  19. 319. 灯泡开关【我亦无他唯手熟尔】
  20. 备案需要域名证书吗?如何下载域名证书?

热门文章

  1. 免費玩雲端運算,Amazon Web Service 雲端運算平台攻略 【1】
  2. 【ASP.NET】网页中嵌入视频
  3. 优秀的 jQuery 文本输入框自动完成 自动提示插件
  4. iPad iPhone程序增加和删除启动画面
  5. Ajax Loading进度gif在线生成
  6. sklearn文档-第一次笔记
  7. 《C和指针》——将无符号整数转换为字符
  8. 【今日CS 视觉论文速览】 24 Dec 2018
  9. 【今日CV 视觉论文速览】 17 Dec 2018
  10. 解决ssh空闲一段时间后自动断开