linux下程序运行一段时间无端崩溃/被杀死,或者内存占用一直增大。linux的坑
如果你的程序没有内存泄漏,且有读多个文件的操作,当运行一段时间后无缘无故崩溃/被杀死。那你遇到的问题跟我遇到的一样。
- 一开始我以为程序有BUG,当抓崩溃信号又抓不到,直到我定时往日记里写当前内存的使用情况,发现内存一直再涨,通过top命令查看程序内存的使用情况,发现所有程序的内存使用并不多,但内存使用率却很高。通过free -m命令查看,发现Buffers / Cached的使用率很高,且一直涨。后来查了才知道,Linux有一个机制就是进行文件操作的时候,Linux为了提高文件IO的速度,会把读取过的文件放到内存中缓存起来(所以Cached会越来越大),然后程序读取文件的时候,先看缓存有没有,避免频繁进行IO操作,提高效率。当你读的文件够多够大,内存就会有被撑爆的情况,内存爆了以后,系统会把一些程序给干掉了,让内存释放出来,所以你的程序就会毫无征兆的挂了。
清理缓存的方式:执行命令
sync
sync
echo 3 > /proc/sys/vm/drop_caches
参考https://blog.csdn.net/feiying00544/article/details/82504779
- 如果你发现只用命令清除缓存,内存还是一直涨,那可能就遇到了Linux的另一个机制。这个机制就是在Linux上申请内存空间的时候,会有两个函数brk和mmap负责,brk负责小的内存空间申请,mmap负责大的内存空间申请。其中brk的单项队列,如果队列顶的空间没有被释放,即使该队列的其他空间都被释放,也不会返还给系统,所以内存空间也会越来越大。
清理缓存的方式:调用malloc_trim函数让系统强制回收
malloc_trim(0);
参考https://blog.csdn.net/cleanfield/article/details/128312395
我的最终做法:内存使用率达到一定使用率后执行下面的代码
system("sync");
system("sync");
system("echo 3 > /proc/sys/vm/drop_caches");
malloc_trim(0);