本文共 1326 字,大约阅读时间需要 4 分钟。
作为一名开发人员,我最近遇到了一个严重的技术问题:Linux系统内存使用量超标,导致Java应用程序无可用内存,最终导致程序崩溃。即使在程序没有挂掉时把程序停掉,系统内存也不会被释放。这个问题已经困扰了我好几个月,分析过好多次都没有找到原因,网上查了一下该问题其他人也都遇到过,不过并没有什么好的解决方案,因为项目一直没有上线,每次当内存不足时导致程序崩溃都是重启服务就好了,索性也就没花太多的时间来找问题。现在项目马上上线了,不能在出现程序崩溃的情况了,况且还是前置系统,更不能出现任何问题。
最开始一直认为是程序的原因导致内存泄漏,使用jdk自带的jmap -F -dump:live,format=b,file=/usr/local/sztFront/logs/heapdump.bin命令输出过几次dump文件,通过MemoryAnalyzer分析,应用程序没有耗内存过大的变量。后台猜测是否日志输出过多导致的,毕竟是前置系统,每天的报文量特别大,日志能到达5,6个G。所以把日志接收报文关了,日志大小马上降下来了,每天200M。程序挂掉的时间变长了,原来差不多一周就挂掉了,现在可以达到两周左右才挂掉,还是不行,没有冲根本上解决问题。
经过在网上搜索各种相关的问题,问题出现在Cached的值过大,导致系统没有可以再分配的内存空间。Cached只要用来缓存文件的,经常读写的文件会被缓存到Cached中,可以增加读写效率,该功能是Linux系统内核提供的,从2.6.16以后的核心版本才提供,也就是老版的操作系统,如红旗DC 5.0、RHEL 4.x之前的版本都没有。这就可以解释为什么我的项目总挂掉了,我的项目主要就是处理文件的,所以接收和下载的文件会被缓存起来,一直耗着内存不释放,即使把程序停掉也不会释放内存。
经过反复思考和验证,找到了以下三种方法可以有效地清理Cached内存:
执行sync命令
sync
命令用于将内核缓存内容刷出到磁盘,这样可以减少内核缓存中的内存占用。执行完sync命令后,可以通过free -m
命令查看内存使用情况。清理Cached内存
使用以下命令清理Cached内存:echo 1 > /proc/sys/vm/drop_cachesecho 2 > /proc/sys/vm/drop_cachesecho 3 > /proc/sys/vm/drop_caches
每次执行这三条命令后,可以通过free -m
命令查看内存可用量是否有所增加。
优化文件缓存策略
在系统配置文件中调整文件缓存策略,避免不必要的文件缓存。例如,在/etc/sysconfig/fsconf.py
文件中设置如下内容:FS_CACHE_SIZE=800FS_CACHEEXP=30
这样可以限制文件缓存的大小和缓存时间,防止文件缓存占用过多内存。
通过上述方法,可以有效地清理系统内存中的Cached内存占用,解决内存不足导致的Java程序崩溃问题。建议在实际应用中结合使用这些方法,并监控系统内存和文件缓存状态,确保系统运行稳定。
转载地址:http://atzfk.baihongyu.com/