我有一个需要优化的遗留Erlang程序。这段代码在运行时使用高达20G的内存。我想知道是否有办法在运行时获得进程本身的Erlang Beam大小?如果可以,那么我可以做一些事情,如果光束大小> 10GB,然后拒绝所有对gen_server进程的调用。谢谢你的帮助!
答案 0 :(得分:0)
也许您可以使用一些proces_info数据:
{记忆,大小}: Size是进程的字节大小。这包括电话 堆栈,堆和内部结构。
process_info(self(), memory).
{memory,17128}
答案 1 :(得分:0)
首先从shell调用memory()
来了解它是否在二进制文件,ets,进程等内存中。接下来,如果进程是罪魁祸首,您可以要求像etop
这样的工具为您提供使用最多内存的进程。这通常可以追踪问题。
如果问题是ETS或二进制文件,那么由于其中的二进制二进制指针,您可能会长时间保留某些大型二进制文件。这需要GC修改来修复。