我有一个大型多线程开源应用程序,它使用专有的 OpenGL 库、Wayland Weston 和 Linux 内核中的专有图形驱动程序。该驱动程序目前正在开发中,因此很可能存在错误。
我观察到以下症状:
free -m
运行我的应用程序时,可用内存 ( ) 会不断消耗。在稳定状态下,大约消耗 1MB/5 分钟。如果我不断地停止和启动我的应用程序,我就能加快记忆丧失的速度。看起来每次重新启动应用程序都会丢失大约 0.5MB。
当我停止应用程序时,内存不会返回到系统。仅在电源循环后才恢复内存。
我已经开始记录内存使用情况,并拍摄
/proc/<pid>/smaps
.我可以看到哪个线程消耗了内存,我将进一步调查。对 smaps 文件的检查表明,随着时间的推移,较旧的快照消耗了更多的内存。
anon_inode:dmabuf
旧快照中还有更多条目,这看起来与以下问题类似:
这种内存泄漏更有可能是用户空间内存泄漏还是内核内存泄漏?
我还可以执行哪些其他诊断来缩小可能的泄漏源范围?
答案1
应用程序是否通过 mmap() 进行任何匿名内存分配?
是否有任何数据或日志文件被写入 RAM 磁盘?有不断启动和结束的线程吗?正确处理线程终止? (去过那里,发现这是一个泄漏。)如果您稍等一下,随着动态结构的释放,内核内存使用量是否会下降?
我认为谁泄漏内存的可能性高于 99%,有利于该应用程序。