这是对我的问题的简短描述:
上下文:
硬件:Toradex Colibri VF61
发行版:Angstrom v2014.12
内核版本:4.0.2-v2
软件语言:Qt/C++
问题: 我开发的应用程序需要在嵌入式产品上运行至少 2 周。我的问题是我的进程运行了 5 天,但有一点内存泄漏,我监控了“Top”,然后它被杀死了。 正如 Top 告诉我的那样,我的进程变成了僵尸。
第 1 次尝试: 我试图用 Valgrind 纠正内存泄漏,但一些“可能”泄漏存在于我在程序中使用的库中(许多是 malloc)。了解所有库是一项非常艰巨的工作,这不是目标。
我认为内存泄漏大约是每天丢失内存的 1%,因此 2 周内丢失 15%。这种泄漏对我来说是可以接受的,因为这个进程在 2 周后不会运行,而嵌入式系统是专门为这个进程运行的,我的机器上没有运行任何其他大进程。 RAM 监控显示该进程占用了 30% 的资源,因此估计两周后为 45%。
2 号尝试: 查询了linux下的内存管理,了解了OOM-Killer。我推断 OOM-Killer 可能认为我的进程运行时间过长并导致内存泄漏并将其杀死。 因此,我将进程的变量“oom_score_adj”设置为 -1000 以防止 OOM-Killer 杀死我的进程,并且我再次尝试长时间运行内存泄漏。 但是这次我的进程变成了“休眠”,并没有被杀死而是无法使用。休眠状态与错误消息“'./app' 中的错误:malloc():内存损坏(快速):0x72518ddf”相关联。我明确指出我的代码中有零个 malloc,仅在我使用的库中。
问题:
您认为像 OOM-Killer 这样的进程是否有可能将我的进程变成僵尸,因为我有内存泄漏并且我的程序已经运行了很长时间?
您认为 Linux 是否有可能将我的进程转为休眠模式,因为泄漏已填满分配给该进程的内存?
最佳答案
关于您的第一个问题,OOM Killer 将在 oom_score 之后杀死一个或多个进程(高内存消耗,对系统不太重要,..)以防系统剩余内存非常少。因此,如果 OOM Killer 杀死了主进程的一个子进程,这会将您的主进程变成僵尸进程。
对于你的第二个问题,如果某个进程的资源不可用,Linux 会将进程置于休眠状态。但在你的情况下,如果存在内存泄漏并且进程消耗大量内存,那么进程将被杀死然后进入休眠状态。
您的应用程序使用 UART 吗?
对了,还有一个 Toradex 社区,工程师可以在这里直接回答你的问题。
最好的问候,贾斯基
关于linux - 内存泄漏会导致我的进程被杀死吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52006503/