java内存占用过高原因是什么?java内存占用过高如何排查?

我们在开发java的时候需要保证java内存,不然就会导致java内存占用过高,影响java的运行,那java内存占用过高原因是什么?接下来我们就来给大家讲解一下java内存占用过高原因!

java内存占用过高原因.jpeg

造成服务器内存占用过高只有两种情况:内存溢出或内存泄漏;

(1)内存溢出:程序分配的内存超出物理内存的大小,导致无法继续分配物理内存,出现OOM报错。

(2)内存泄漏:不再调用的对象一直占用着内存不释放,导致所占用的这块内存被浪费掉,久而久之,内存泄漏的对象堆积起来,也会导致物理机的内存被耗尽,出现OOM报错。

java内存占用过高如何排查?

1.查看

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

使用dstat

java内存占用过高原因是什么?java内存占用过高如何排查?.jpg

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

使用top

1.jpg

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

2.定位线程问题

使用ps查看16494的线程情况

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

2.jpg

看到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

3.jpg

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

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

parking to wait for <0x0000000085dce510>

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

当出现java内存占用过高的时候,我们一定要及时去排查,及时了解原因才能做出有针对性的解决方案,提高java运行效率!最后大家如果想要了解更多java常见问答知识,敬请关注奇Q工具网。

推荐阅读:

spring框架的核心功能是什么?spring框架如何工作?

java不运行怎么回事?java如何正确运行?

hibernate怎么运行?hibernate支持哪些数据库?