彻底解决Java进程占用内存过高的问题

 内存使用率过高

查询各进程占用内存情况:ps aux | awk '{print $6/1024/1024 " GB\t\t" $2,$11}' |grep java|grep -v grep | sort -n

解决方法:

A:可能是代码原因导致的问题:

1、使用命令:top 查看当前进程的状态

2、从上图可以看到PID:18121的java进程占用内存较大。定位线程问题(通过命令查看PID 为25894 进程的线程情况),命令:# ps p 18121 -L -o pcpu,pmem,pid,tid,time,tname,cmd

由此可以看到这PID:18121的进程产生了很多线程。接下来就可以通过jstack查看内存使用的堆栈。

3、查看内存使用的堆栈:在这里我们挑选了TID=18121的线程进行分析,首先需要将18121这个id转换为16进制。需输入如下命令,

4、将PID为916的堆栈信息打印到jstack.log中,命令:jstack -l 18121 > jstack.log

5、分析

   可以看到这个线程状态为:RUNNABLE。是正在运行状态的

    另外其它的大部分线程状态为:WAITING。通过查看文件分析 看到大量 Java Thread State。

   说明它在等待另一个条件的发生,来把自己唤醒,或者干脆它是调用了 sleep(N)。

   此时线程状态大致为以下几种:

   java.lang.Thread.State: WAITING (parking):一直等那个条件发生;

   java.lang.Thread.State: TIMED_WAITING (parking或sleeping):定时的,那个条件不到来,也将定时唤醒自己。

 查看堆栈信息文件,命令:vim jstack.log

6.代码优化:将文件发送给开发。优化下线程

B:可能是其他原因导致的问题:

1、使用ps命令:ps -ef | grep java | grep -v grep

查看当前java进程列表

可以判断,是因为关闭java服务时,java进程没有自动关闭,导致内存没有释放。

2、使用lsof命令:lsof | grep java |grep -v grep

查看当前进程的运行状态

输出结果筛选ESTABLISHED可以看到正常运行的java状态应为PID:4724的java进程

3、杀掉其他的java的进程

kill -9 PID

然后查看主机监控,果然内存使用率下降,网站运行正常

猜你喜欢

转载自blog.csdn.net/baidu_38432732/article/details/107686017
今日推荐