如何精准定位并解决Java应用内存占用过高的根本原因?

2026-04-13 05:002阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计659个文字,预计阅读时间需要3分钟。

如何精准定位并解决Java应用内存占用过高的根本原因?

故障:收到服务器报警,内存使用率超过80%。

检查:

1.使用dstat和top查看内存使用情况。

2.使用dstat检测内存占用最高的应用。

3.使用dstat发现内存占用最高的应用是Java应用,占用了2232M内存。

4.这台服务器运行了几个Java应用,导致内存使用过高。

故障:收到服务器报警,内存使用率超过80%

1.查看

使用dstat和top查看内存使用最高的应用

使用dstat

查到内存占用最高的是java应用,使用2253M内存,但是这台服务器跑了好几个java,具体哪个进程使用top看下资源情况

使用top

可以看到java应用整体内存使用率超过了70%,其中pid为16494的进程 一个应用占了28.7的内存

2.定位线程问题

使用ps查看16494的线程情况

如何精准定位并解决Java应用内存占用过高的根本原因?

命令:ps p 16494 -L -o pcpu,pmem,pid,tid,time,tname,cmd

看到16494这个pid的应用产生了很多线程。

3.查看内存使用的堆栈

使用jstack查看

我们挑选了TID=17417的线程进行分析

在分析前需要将17417这个id转换为16进制,方便查找信息

[root@localhost ~]# printf "%x\n" 17417 4409

16进制为4409

将pid为16494的应用打印到日志中

[root@localhost ~]# jstack -l 16494 > jstack.log

4.查看内存堆栈信息

[root@localhost ~]# vim jstack.log

在日志信息中查找刚刚转换的4409

可以看到这个线程状态为WAITING

通过查看日志发现有大量的 waiting on condition

parking to wait for <0x0000000085dce510>

存在大量线程等待被唤醒,占用大量内存

5.代码优化

将相应日志发送给相应开发,优化线程

补充:分析java线程占用cpu或者内存高的代码

1、通过top查看占用cpu或者内存高的进程截图如下

2、通过对应的cpu找到PID也就是进程对应的pid,然后找到java进程106854这个进程id

3、通过命令top -Hp PID 例如top -Hp 106854

就可以列出该进程下的所有线程id

4、通过输出大写的P查看线程占用cpu最高的或者通过大写M查看内存占用最高的

然后找到109391这个线程id

5、使用命令printf “%x\n” 109391 输出对应的十六进制码,1ab4f这个码是为了过滤线程id查到对应的代码

6、使用命令jstack PID|grep 1ab4f

7、通过上面的输出发现kafka,所以会联想到,kafka一直监听消息,所以消耗cpu,正常现象

8、如果出现自己写的类,说明需要修改代码逻辑了

以上为个人经验,希望能给大家一个参考,也希望大家多多支持易盾网络。如有错误或未考虑完全的地方,望不吝赐教。

标签:解决方案

本文共计659个文字,预计阅读时间需要3分钟。

如何精准定位并解决Java应用内存占用过高的根本原因?

故障:收到服务器报警,内存使用率超过80%。

检查:

1.使用dstat和top查看内存使用情况。

2.使用dstat检测内存占用最高的应用。

3.使用dstat发现内存占用最高的应用是Java应用,占用了2232M内存。

4.这台服务器运行了几个Java应用,导致内存使用过高。

故障:收到服务器报警,内存使用率超过80%

1.查看

使用dstat和top查看内存使用最高的应用

使用dstat

查到内存占用最高的是java应用,使用2253M内存,但是这台服务器跑了好几个java,具体哪个进程使用top看下资源情况

使用top

可以看到java应用整体内存使用率超过了70%,其中pid为16494的进程 一个应用占了28.7的内存

2.定位线程问题

使用ps查看16494的线程情况

如何精准定位并解决Java应用内存占用过高的根本原因?

命令:ps p 16494 -L -o pcpu,pmem,pid,tid,time,tname,cmd

看到16494这个pid的应用产生了很多线程。

3.查看内存使用的堆栈

使用jstack查看

我们挑选了TID=17417的线程进行分析

在分析前需要将17417这个id转换为16进制,方便查找信息

[root@localhost ~]# printf "%x\n" 17417 4409

16进制为4409

将pid为16494的应用打印到日志中

[root@localhost ~]# jstack -l 16494 > jstack.log

4.查看内存堆栈信息

[root@localhost ~]# vim jstack.log

在日志信息中查找刚刚转换的4409

可以看到这个线程状态为WAITING

通过查看日志发现有大量的 waiting on condition

parking to wait for <0x0000000085dce510>

存在大量线程等待被唤醒,占用大量内存

5.代码优化

将相应日志发送给相应开发,优化线程

补充:分析java线程占用cpu或者内存高的代码

1、通过top查看占用cpu或者内存高的进程截图如下

2、通过对应的cpu找到PID也就是进程对应的pid,然后找到java进程106854这个进程id

3、通过命令top -Hp PID 例如top -Hp 106854

就可以列出该进程下的所有线程id

4、通过输出大写的P查看线程占用cpu最高的或者通过大写M查看内存占用最高的

然后找到109391这个线程id

5、使用命令printf “%x\n” 109391 输出对应的十六进制码,1ab4f这个码是为了过滤线程id查到对应的代码

6、使用命令jstack PID|grep 1ab4f

7、通过上面的输出发现kafka,所以会联想到,kafka一直监听消息,所以消耗cpu,正常现象

8、如果出现自己写的类,说明需要修改代码逻辑了

以上为个人经验,希望能给大家一个参考,也希望大家多多支持易盾网络。如有错误或未考虑完全的地方,望不吝赐教。

标签:解决方案