内存泄露究竟在哪里?
前不久在工作中需要写个linux下的C程序,涉及到多线程,经过一段时间努力,跌跌撞撞的总算写完了,可是在测试的时候出现了问题:因为这个程序需要长时间运行,所以我进行了一个测试,让程序跑了一天一夜,到第二天发现操作系统空闲内存减少了一大块,当时的第一反应是出现了内存泄露,于是用了C库自带的内存检测函数加进去,测了一段时间,没有发现泄露的部分,然后又换了valgrind来测试,发现了一些疑似泄露的地方,但是我都查了代码,是正常的地方,没有内存泄露,那到底是哪里出了问题呢?
在网上找了很久,最后终于发现,原来linux的内存处理方式和windows是有很大不同的,windows程序占用的空间一旦释放,空间就会记入空闲空间中,因此,windows的空闲空间一直会保持一个量。而linux中却不一样了,空闲空间用过后,即使释放了也不会归入空闲空间,而是成为buffers或是cache,因此linux系统中你看到free在不断减少,其实是正常的,这时候相应的buffers和cache却在增加,他们的总量也会维持一个量。linux为什么这么做呢?因为linux希望尽可能利用内存,以提高程序的处理速度,在程序再次需要内存的时候,会优先去buffers和cache中申请,以提高程序访问内存的效率。
第一次发文,有什么错误的地方,希望各位批评指正,谢谢!
浙公网安备 33010602011771号