这是一个非常丑陋的问题。
我有一个 C++ 程序,它在循环中执行以下操作:
- 等待 JMS 消息
- 计算一些数据
- 发送 JMS 消息作为响应
我的程序(我们称它为“Bob”)有相当严重的内存泄漏。内存泄漏位于别人编写的共享库中,我必须使用它,但我无权访问源代码。
此内存泄漏导致 Bob 在循环的“计算某些数据”阶段崩溃。这是一个问题,因为另一个程序正在等待 Bob 的响应,如果没有收到响应,它会非常沮丧。
由于各种限制(是的,这是一个 X/Y 问题,我告诉过你它很丑陋),我确定我唯一可行的策略是修改 Bob,使其在循环中执行以下操作:
- 等待 JMS 消息
- 计算一些数据
- 发送 JMS 消息作为响应
- 检查它是否有使用“过多”内存的危险
- 如果是这样,fork 并执行自身的另一个副本,然后优雅地退出
我的问题如下:
检测我们是否使用“过多”内存的最佳(可靠但不太低效)方法是什么?我目前的想法是将 getrlimit(RLIMIT_AS) rlim_cur
与 getrusage(RUSAGE_SELF) ru_maxrss
进行比较;那是对的吗?如果没有,什么是更好的方法? Bob 在各种主机上的 Linux VM 中运行,所有主机都具有不同的内存量。
最佳答案
假设内存泄漏发生在“计算一些数据”阶段,我认为将那部分重构为一个单独的程序并在其自己的进程中执行它可能更有意义。这样一来,您至少可以隔离有问题的代码并使其在未来更容易替换它,而不是仅仅通过让程序在内存不足时自行重启来掩盖问题。
“计算一些数据”部分可以是一个长时间运行的进程,等待来自主程序的请求并在必要时自行重启,或者(甚至更简单)它可以是一个一次性的程序,只需要它在 *argv
中的数据并将其结果发送到 stdout
。然后你的主循环每次都可以 fork 并执行它,并在它们返回时读取结果。如果可能的话,我会选择更简单的选项,但这当然取决于您的需求。
关于c - 通过 fork 减轻内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42260106/