linux-buff/cache过大导致内存不足-程序异常
Linux内存使用量超过阈值,使得Java应用程序无可用内存,最终导致程序崩溃。即使在程序没有挂掉时把程序停掉,系统内存也不会被释放。free -h 命令查看内存使用情况。free -h问题出现在Cached的值过大,导致系统没有可以再分配的内存空间。Cached只要用来缓存文件的,经常读写的文件会被缓存到Cached中,可以增加读写效率,该功能是Linux系统内核提供的,从2....
Linux内存使用量超过阈值,使得Java应用程序无可用内存,最终导致程序崩溃。即使在程序没有挂掉时把程序停掉,系统内存也不会被释放。
free -h 命令查看内存使用情况。
free -h
问题出现在Cached的值过大,导致系统没有可以再分配的内存空间。Cached只要用来缓存文件的,经常读写的文件会被缓存到Cached中,可以增加读写效率,该功能是Linux系统内核提供的,从2.6.16以后的核心版本才提供,也就是老版的操作系统,如红旗DC 5.0、RHEL 4.x之前的版本都没有。这就可以解释为什么我的项目总挂掉了,我的项目主要就是处理文件的,所以接收和下载的文件会被缓存起来,一直耗着内存不释放,即使把程序停掉也不会释放内存。最后找到了三条执行,可以清理cached的内存
三条指令:
sync
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
执行完这三条指令后通过free -h命令查看,free可用内存马上增多,buff/cache列值变小,说明内存被释放了,但是不能总是手动的执行这三条指令,所以最后写了一个shell脚本,开启Linux定时任务crond,每天早上检查一次free内存,执行这三条命令.
注意:在执行这三条命令之前一定要先执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-Node、已延迟的块 I/O 和读写映射文件)
解决方案(自动)
1、编写shell定时任务脚本freemem.sh
#!/bin/bash
echo "开始清理缓存"
# 写入硬盘,防止数据丢失
sync;sync;sync;
# 延迟10S
sleep 10
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
echo "清理缓存结束"
2、使用crontab -e命令编辑当前用户的crontab
0 6 * * * /home/jar/freemem.sh
*/1 * * * * /home/jar/freemem.sh
3、重启crond服务
service crond restart
systemctl restart crond
4、查看crond服务是否重启成功
service crond status
systemctl status crond
最后,问题解决。我设定的定时任务是每天早上6点执行一次freemem.sh脚本
一分钟执行一次
* * * * * /home/jar/freemem.sh
清理日志
#!/bin/bash
# 定义要清理日志文件的目录,你可以根据实际情况修改此处路径
LOG_DIR="/opt/platform/logs/prj"
# 定义保留最近多少天的日志文件,可按需更改天数
DAYS_TO_KEEP=6
# 获取当前时间的时间戳(秒数)
CURRENT_TIME=$(date +%s)
# 遍历指定目录下的所有文件
for file in $LOG_DIR/*; do
# 判断是否是文件(而不是目录等其他类型)
if [ -f "$file" ]; then
# 获取文件的最后修改时间(秒数)
FILE_MOD_TIME=$(date +%s -r "$file")
# 计算时间差(单位:秒)
TIME_DIFFERENCE=$((CURRENT_TIME - FILE_MOD_TIME))
# 将时间差转换为天数
DAYS_AGO=$((TIME_DIFFERENCE / 86400))
# 如果文件的最后修改时间距离现在超过了指定保留天数,则删除该文件
if [ $DAYS_AGO -gt $DAYS_TO_KEEP ]; then
rm -f "$file"
echo "已删除文件: $file"
fi
fi
done
更多推荐



所有评论(0)