编译后的代码如C
消耗很少的内存。
解释码如Python
消耗更多的内存,这是可以理解的。
使用 JIT,程序在运行时(有选择地)编译为机器代码。那么 JIT 程序的内存消耗不应该介于编译程序和解释程序之间吗?
相反,经过 JIT 处理的程序(例如 PyPy
)比等效的解释程序(例如 Python
)消耗的内存多几倍。为什么?
最佳答案
跟踪 JIT 编译器需要更多的内存,因为它们不仅需要保留 VM 的字节码,还需要保留可直接执行的机器代码。然而,这只是故事的一半。
大多数 JIT 还将保留大量有关字节码(甚至机器代码)的元数据,以允许他们确定哪些需要 JIT,哪些可以不做。跟踪 JIT(例如 LuaJIT)还创建跟踪快照,用于在运行时微调代码,执行循环展开或分支重新排序等操作。
有些还保留常用代码段的缓存或快速查找缓冲区以加快 JIT 代码的创建(LuaJIT 通过 DynAsm 执行此操作,如果正确完成,它实际上可以帮助减少内存使用量,就像 dynasm 的情况一样)。
内存使用在很大程度上取决于所使用的 JIT 引擎和它编译的语言的性质(强类型与弱类型)。一些 JIT 采用先进的技术,例如基于 SSA 的寄存器分配器和变量活跃度分析,这些优化也有助于消耗内存,以及更常见的事情,如循环变量提升。
关于compiler-construction - 为什么 JIT 代码比编译或解释的代码消耗更多的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8675490/