现代虚拟机如何处理内存分配?

我正在用C语言写一个简单的堆栈机,主要用于学习目的。在使用malloc/free进行内存操作后,我认为阅读现代虚拟机的内存分配特定代码是一个好主意。

我下载了Lua源代码并开始阅读。过了一会儿,我意识到涉及许多宏问题,而我找不到实际内存分配的代码(即malloc调用)。

find . -exec grep -i "malloc" '{}' \; -print

它只打印了一些带有malloc单词的Lua宏。Lua VM(和编程语言)根本不使用malloc

因此,这引发了我一个问题:现代VM如何处理内存分配?Lua如何从堆中分配内存?除malloc之外,是否有其他分配方式?其他方法的优缺点是什么?

我还想知道安全地使用分配的内存的最佳实践,设计模式等。我在Lua的源代码中看到,在分配内存之前有很多间接操作。我从哪里可以了解这些内容?

原文链接 https://stackoverflow.com/questions/11324117

点赞
stackoverflow用户255049
stackoverflow用户255049

Lua 绝对使用 malloc,以 realloc 的形式(还可以传递自定义的分配器),然而,因为 Lua 使用类似于 99% 的基于 VM 的语言的 GC,它使用宏来自动添加 GC 标头块到分配中。

你会发现 Lua 的内存都由 lmem.clmem.h 中的 LuaM_ 例程处理,这些例程都使用 VM 的全局状态来存储分配器,它最初设置为 l_alloc(来自 lauxlib.c),但可以通过 lua_setallocf 进行更改。

最近,LuaJIT 添加了分配下沉,并计划一些非常酷的内存功能,你可以在这篇 LuaJIT 垃圾回收 文章中了解更多。该文章涵盖了关于 VM/JIT 内存分配、下潜、聚合和垃圾回收的很多策略和设计。

正如你所看到的,内存分配和下沉策略与你采用的 GC 密切相关(如果有的话)。

在各种内存 分配器 的利弊方面,使用标准的 malloc 很容易使用,但代价是速度慢和对齐和各种额外块的浪费。

转向更先进的区域、池、砖块分配器,我们可以极大地加速事情(特别是针对固定大小的内部 VM 分配),避免像 malloc 这样的更通用的分配器可能出现的大量碎片化和开销,但当然这些分配器更复杂,并且如果从头开始,你必须对它们进行调试(在更大的系统中如 VM,这只会引发问题),而不是经过验证的 CRT malloc 实现。

2012-07-04 07:23:00
stackoverflow用户107090
stackoverflow用户107090

Lua 核心不使用 malloc 和相关函数。它依赖于用户提供的内存分配函数,该函数具有类似于 realloc 的语义(但在处理 NULL 指针和大小为 0 时更精确)。请参阅 lua_Alloc

辅助 Lua 库提供了一个方便的 luaL_newstate 函数,该函数使用基于标准 reallocfree 的内存分配函数通过核心 lua_newstate 函数创建 Lua 状态。其他客户端可以使用适合其应用程序的任何内存分配方式。

2012-07-04 10:42:14