当前位置: 首页 > news >正文

java线上问题排查-OOM内存溢出

一、异常初步判断

  1. 系统资源检查
    通过 topfreedf 等命令查看系统资源:

    top
    free -h
    df -h
    
    • 发现进程 CPU 占用异常高(如 900%),可能原因:
      • 死循环
      • 大量 GC(Full GC 高频触发)
  2. GC 频率确认
    使用 jstat 查看 Java 进程的 GC 状态:

    jstat -gc <pid>进程号 1000 # 每秒刷新
    jstat -gcutil 12345 1000 5  # 监控进程12345,每秒刷新1次,共5次
    
    • 如果 Full GC 达到每秒一次,说明可能存在内存泄漏问题。

二、线程和堆现场收集

  1. 保存线程栈

    jstack <pid> > jstack.log
    
  2. 导出堆内存快照

    jmap -dump:format=b,file=heap.hprof <pid>
    
    • 然后重启服务以恢复正常运行。

三、线程栈分析

  1. 统计线程数量

    grep 'java.lang.Thread.State' jstack.log | wc -l
    
    • 示例:464 个线程,并无异常。
  2. 分析线程分布与热点

    grep -A 1 'java.lang.Thread.State' jstack.log \| grep -v 'java.lang.Thread.State' \| sort | uniq -c | sort -n
    
    • 可发现线程主要在等待、I/O 或 EPoll 等系统调用,若无异常,则问题可能在内存对象。

四、堆内存分析

jhat查看

jhat heapdump.hprof
# 打开浏览器访问 http://localhost:7000 查看对象分布

本地查看

  1. 下载堆文件
    • .hprof 文件下载到本地,因为 Linux 服务器上直接分析困难。
  2. 使用 MAT (Memory Analyzer Tool) 分析
    • 打开堆文件,选择 “Memory Leak Suspects”
    • 找到占用大量内存的对象。
    • 在项目中搜索对象名,定位到可能的 Bean 对象及其 Map 属性

五、快速内存排查命令

# 1. 持续监控内存占用
watch -n 1 "jstat -gcutil <pid> | awk '{print $4,$7}'"# 2. 导出堆转储
jmap -dump:live,format=b,file=oom.hprof <pid># 3. 快速查看大对象占用
jmap -histo <pid> | head -20

进一步检查

# 查看堆结构
jmap -heap <pid># 查看内存对象分布
jmap -histo:live <pid> | head -20# 线程数 & 文件描述符数
pstree -p <pid> | wc -l
ls /proc/<pid>/fd | wc -l

六、常见 OOM 类型

类型异常信息
Heap OOMjava.lang.OutOfMemoryError: Java heap space
Metaspace OOMjava.lang.OutOfMemoryError: Metaspace
Direct Memory OOMjava.lang.OutOfMemoryError: Direct buffer memory

七、jstat 常用查看项

jstat [-options] <pid> [interval]
参数功能
-class查看类加载信息
-compile编译统计信息
-gcGC 信息
-gcutil各区域 GC 使用情况
-gcoldOld 区 GC 详细信息

💡 Tipjstat 是 JVM 内存排查的利器,可结合 watch 命令持续监控。

场景命令示例说明
持续观察 CPU/内存watch -n 1 "top -b -n 1 | head -20"
监控 GC 情况watch -n 1 "jstat -gcutil | awk '{print $4,$7}'"
堆对象热点监控watch -n 5 "jmap -histo:live | head -20"
发现变化watch -n 1 -d "命令"高亮显示与上次输出不同的行

watch 刷新屏幕时,会清空终端内容,因此适合临时监控,不适合记录历史数据。

如果需要记录,可将命令输出重定向到文件,再用 tail -f 监控:

jstat -gcutil <pid> >> gc.log
tail -f gc.log
http://www.dtcms.com/a/432071.html

相关文章:

  • 阿里云国际站官网如何让网站不被收录
  • Notepad++下载安装图文教程(附安装包)
  • ProtoBuf使用手册(入门)
  • 网站服务器 电信推广码怎么填
  • 数据驱动+AI赋能:互联网项目管理全流程的技术破局与方法论实践
  • 贵阳网站建设设计手机做任务的网站
  • AI大模型:(三)1.4 Dify聊天助手快速搭建智能淘宝店小二
  • dw做网站怎么排版网站开发应财务如何记账
  • 网站开发流行工具如何知道一个网站做的什么推广
  • 网站建设方面书籍手机网站导航特效
  • 网站策划包括哪些内容中国哪家网站做仿古做的好
  • 常用的建一个网站要多少钱四川省和城乡建设厅网站
  • 笔记:标准化和归一化的学习
  • 培训学校类网站建设方案1软装包括哪些
  • 计算机网络【第三章-数据链路层】
  • 网站 建设 内容 安排济南seo整站优化厂家
  • Ubuntu 中获取指定软件依赖安装包
  • 利用CountDownLatch批量处理解决实际业务问题
  • 网站建设公司新员工培训ppt模板北京发布紧急通知2023年
  • 移动端网站怎么做软件界面设计软件有哪些
  • Linux系统C语言中与文件操作相关的核心库函数讲解
  • 大数据成矿预测系列(二) | 证据权重法如何克服自身局限?
  • 基于springboot的家校合作管理系统
  • 湖南网站建设 搜搜磐石网络网站首页图片素材
  • STM32控制开发学习笔记【基于STM32 HAL库】
  • 滕州做网站比较好的网络公司网页设计十大品牌
  • 【项目】基于Spring全家桶的论坛系统 【上】
  • 北京移动端网站公司基于PHP的家教网站开发环境
  • 网站毕设怎么做网站开发合同技术目标
  • 成都市建设网站首页kol营销