java内存溢出排查top_内存溢出排查命令

本文介绍了如何使用jmap和jstack工具来诊断服务器Java应用的内存占用和线程问题,包括内存镜像分析、对象统计、类加载器信息、线程栈跟踪,并提供了一个脚本示例,用于在线程数超过2500时自动dump关键进程的内存和线程信息。
摘要由CSDN通过智能技术生成

可以先用top命令查询出占用内存最多的进程,然后使用下面指令分析占用内存较大的代码

查看进程的内存镜像信息

jmap -572 // 572表示的是进程id

显示java堆详细信息

jmap -heap -572 // 572表示的是进程id

显示堆中对象的统计信息

jmap -histo:live pid

下面结果中,第一列代表数量,第二列代表实例数量,第三列代表内存大小,第四列代表完全限定的类名。

结果实例如下:

12d74be1e5c3

image.png

描述:打印类加载器信息

jmap -clstats pid

打印等待终结的对象信息

jmap -finalizerinfo pid

dump jvm内存

jmap -dump:format=b,file=dump_file_name pid

举例:dump pid 为 4738 的 java 进程的内存到 app_mem_dump.bin 文件

jmap -dump:format=b,file=app_mem_dump.bin 4738

dump jvm 线程栈

命令格式:

jstack pid > dump_file_name

举例:dump pid 为 4738 的 java 进程的线程栈到 app_thread_dump.txt 文件

jstack 4738 > app_thread_dump.txt

脚本分享

当服务器线程数超过 2500 时自动 dump 线程数最高的 java 进程的内存及线程栈。

#!/usr/bin/env bash

#

# 服务器线程数达到 2500 以上时 dump 线程数最多的 java 进程的线程及内存

#

source ~/.bashrc

cur_thread_num=`ps -efL | wc -l`

if [ $cur_thread_num -le 2500 ]; then

exit 0

fi

cur_date=`date +"%Y-%m-%d_%H-%M-%S"`

cd ./dumpfile

# 服务器当前线程 dump 到文件:按照线程数由大到小排序显示

ps -efL --sort -nlwp > server_thread_dump_$cur_date

# dump 线程数最多的 jvm 的线程及内存

most_thread_num_pid=`cat server_thread_dump_$cur_date | sed -n '2p' | awk '{print $2}'`

nohup jstack -l $most_thread_num_pid > java_app_thread_dump_${cur_date}_pid_${most_thread_num_pid} &

nohup jmap -dump:format=b,file=java_app_mem_dump_${cur_date}_pid_${most_thread_num_pid} $most_thread_num_pid &

exit 0

如果出现性能问题,首先需要确认是Netty的问题还是业务的问题,通过jstack命令或者jvisualvm工具打印线程堆栈,看看进程都在忙什么,按照线程CPU使用情况进行排序(top -H 命令采集),看线程在忙什么。通常如果采集几次都发现Netty的NIO线程的堆栈停留在select操作上,说明I/O比较空闲,性能平静不是netty。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值