随笔 - 209  文章 - 0 评论 - 11 阅读 - 30万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

 

 

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

使用top

 

 

 

 

 

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

2.定位线程问题

使用ps查看46243的线程情况

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

 

 

 

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

3.查看内存使用的堆栈

使用jstack查看

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

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

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

b4a8

16进制为b4a8

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

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

4.查看内存堆栈信息

[root@localhost ~]# vim jstack.log

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

 

 

 

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

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

parking to wait for <0x0000000000000000>

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

5.代码优化

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

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

1、通过top查看占用cpu或者内存高的进程截图如下【备注输入大写P以cpu从大到小排序,大写M以内存大小排序】

 

 

 

 

 

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

 

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

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

 

 

 

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

然后找到46243这个线程id

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

 

6、使用命令jstack 46243(PID)|grep b4a8【备注PID是进程的id,b4a8是这个进程下的一个线程占用最高的cpu十六进制码】

 

 

 

 



posted on   博客园197  阅读(241)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示