温馨提示×

centos java日志内存溢出如何查

小樊
44
2026-09-12 00:28:12
栏目: 编程语言

在 CentOS 上排查 Java 日志中的内存溢出(OutOfMemoryError),通常可以按下面步骤来做。


一、确认是不是内存溢出

先看日志中是否有类似内容:

java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: GC overhead limit exceeded
java.lang.OutOfMemoryError: Metaspace
java.lang.OutOfMemoryError: Unable to create new native thread

不同类型含义不同:

  • Java heap space:堆内存不足
  • Metaspace:类元数据区不足(JDK8+)
  • GC overhead limit exceeded:GC 频繁但回收很少
  • Unable to create new native thread:线程数过多 / 系统限制

二、查看 Java 进程内存占用

1. 查看进程

ps -ef | grep java

jps -l

2. 查看内存使用

top -p <pid>

关注:

  • RES(物理内存)
  • %MEM

三、查看 JVM 参数是否合理

jinfo <pid> | grep -i heap

ps -ef | grep java

重点看:

-Xms
-Xmx
-XX:MetaspaceSize
-XX:MaxMetaspaceSize

示例:

-Xms512m -Xmx1024m

四、生成并分析堆转储(最重要)

1. 手动生成 dump

jmap -dump:format=b,file=/tmp/heap.hprof <pid>

2. 自动在 OOM 时生成(推荐)

启动参数加:

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/heap.hprof

五、分析 dump 文件

方法 1:MAT(最常用)

  • 下载 Eclipse MAT
  • 打开 heap.hprof
  • Dominator Tree
  • 找出占用内存最大的对象

方法 2:命令行粗略看

jhat /tmp/heap.hprof

然后访问:

http://localhost:7000

六、查看 GC 日志(非常关键)

开启 GC 日志

-Xloggc:/var/log/java/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps

分析重点

  • Full GC 是否频繁
  • 每次回收后内存是否还在涨
  • Old Gen 是否持续增长

七、系统层面检查(CentOS)

1. 系统内存

free -h

2. 线程数限制

ulimit -u

3. 内存占用排行

ps aux --sort=-%mem | head

八、常见原因总结

  • 内存参数太小(-Xmx 不够)
  • 内存泄漏(集合、缓存未清理)
  • 一次加载大量数据
  • 线程数过多
  • 第三方库 bug

如果你愿意,可以把:

  • OOM 日志片段
  • JVM 启动参数
  • Java 版本

发出来,我可以帮你具体判断是哪种溢出。

0