解决共享对象中的内存泄漏问题

时间:2015-08-11 12:34:13

标签: python memory-leaks shared-libraries

在我的Python代码中,我使用第三方共享对象,.so文件,我怀疑它包含内存泄漏。

在我的程序运行期间,我有一个循环,我重复调用共享对象的函数。当程序运行时,我可以在htop中看到,内存使用量正在稳步增加。当RAM已满时,程序将与终端输出killed崩溃。我的假设是,如果内存泄漏是由共享对象产生的,因为否则Python会引发Exception.MemoryError

我尝试使用reload(modul_name)后跟gc.collect(),但根据htop没有释放内存。

我该怎么办?

2 个答案:

答案 0 :(得分:1)

检查库是否提供了任何对象销毁/释放功能,以便客户端可以释放内存。

看看你是否可以确定它是否是导致明显泄漏的单个函数,然后尝试避免调用该函数。

除此之外,除非您拥有共享库的源代码或维护者的耳朵,否则您无能为力。

答案 1 :(得分:1)

作为临时修复,您可以使用装饰器在sperate过程中运行您的函数,但最终您需要修复底层漏洞。

import multiprocessing
def memory_leak(func):
  def conn_func(conn, *args, **kwargs):
    conn.send(func(*args, **kwargs))
    conn.close()

  def new_function(*args, **kwargs):
    parent_conn, child_conn = multiprocessing.Pipe()
    p = multiprocessing.Process(target=conn_func, args=[child_conn]+list(args), kwargs=kwargs)
    p.start()
    result = parent_conn.recv()
    p.join()
    return result

  return new_function