linux - 内存泄漏会导致我的进程被杀死吗?

标签 linux memory-management memory-leaks malloc

这是对我的问题的简短描述:

上下文:

硬件: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/

相关文章:

.net - 尽管所有堆中都有常量字节,有什么方法可以限制 Gen 0、1 和 2 的垃圾收集?这是内存泄漏的迹象吗?

java - 使用 JSch 执行 'sudo su -'

linux - 如何在 Linux 上转义单引号

linux - 是否可以使用文本编辑器编辑符号链接(symbolic link)?

c - 尝试解除分配二维数组时访问冲突读取

memory-management - WebSphere 6.1 分代 gc 默认 Nursery 大小限制

c++ - 当我删除一个对象时出现段错误 - GDB 在 free() 中说

c++ - 是否可以删除子函数中的对象?

c - 有没有办法将 '-lm' 设置为 GCC 的默认值?

android - Activity 泄漏了最初添加的窗口