记一次java内存溢出的处理过程

1、发现应用服务器隔段时间会自动重启,经常查看日志发现是由于内存溢出导致服务器自动重启,日志报错信息如下

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid14187.hprof ...
Heap dump file created [5815527852 bytes in 18.505 secs]
Exception in thread "Log4j2-TF-1-AsyncLoggerConfig-24" java.lang.OutOfMemoryError: Java heap space

2、从服务器下载java_pid14187.hprof文件下来,使用MemoryAnalyzer进行分析(文件5G多,需修改MemoryAnalyzer安装目录下MemoryAnalyzer-1.10.0.20200225-win32.win32.x86_64\mat\MemoryAnalyzer.ini的内存大小才能打开,当然也可用使用jdk自带的jvisualvm软件打开,也是需要改大内存的)

分析发现并没有特别大的占用内存变量

记一次java内存溢出的处理过程

3、排除代码问题后,检查系统内存使用情况发现free为0,而buff/cache为2G多

记一次java内存溢出的处理过程

4、想到该节点的应用程序存在大量的文件读写交易,应该是由于该问题导致

5、根据百度查询了相关类似的问题,定位为缓存不释放导致应用可用的内存不足导致的报错

6、解决办法,写了个缓存清理脚本:

#! /bin/sh
used=`free -m | awk 'NR==2' | awk '{print $3}'`
free=`free -m | awk 'NR==2' | awk '{print $4}'`
echo "===========================" >> /usr/local/freeBuffCache/logs/freeBuffCache.log
date >> /usr/local/freeBuffCache/logs/freeBuffCache.log
echo "Memory usage before | [Use:${used} MB][Free:${free} MB]" >> /usr/local/freeBuffCache/logs/freeBuffCache.log
if [ $free -le 6144 ]; then
                sync && echo 1 > /proc/sys/vm/drop_caches
                sync && echo 2 > /proc/sys/vm/drop_caches
                sync && echo 3 > /proc/sys/vm/drop_caches
                used_ok=`free -m | awk 'NR==2' | awk '{print $3}'`
                free_ok=`free -m | awk 'NR==2' | awk '{print $4}'`
                echo "Memory usage after  | [Use:${used_ok} MB][Free:${free_ok} MB]" >> /usr/local/freeBuffCache/logs/freeBuffCache.log
                echo "OK" >> /usr/local/freeBuffCache/logs/freeBuffCache.log
else
                echo "Not required" >> /usr/local/freeBuffCache/logs/freeBuffCache.log
fi
exit 0
 

然后添加定时任务:

4、添加定时任务:
输入命令:crontab -e
编辑该文件添加以下内容(时间自定义):
33 16 * * * /usr/local/freeBuffCache/freeBuffCache.sh


5、重启crond服务

/sbin/service crond restart

6、查看crond服务是否重启成功

/sbin/service crond status

说明:
crontab文件的格式:M H D m d cmd.

基本格式 :

* * * * * command

分 时 日 月 周 命令

M: 分钟(0-59)。每分钟用*或者 */1表示

H:小时(0-23)。(0表示0点)

D:天(1-31)。

m: 月(1-12)。

d: 一星期内的天(0~6,0为星期天)。

问题参考:https://my.oschina.net/u/3049601/blog/2990323?tdsourcetag=s_pcqq_aiomsg