现代虚拟机如何处理内存分配?
2015-6-13 9:32:0
收藏:0
阅读:182
评论:2
我正在用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用户107090
Lua 核心不使用 malloc
和相关函数。它依赖于用户提供的内存分配函数,该函数具有类似于 realloc
的语义(但在处理 NULL
指针和大小为 0 时更精确)。请参阅 lua_Alloc。
辅助 Lua 库提供了一个方便的 luaL_newstate
函数,该函数使用基于标准 realloc
和 free
的内存分配函数通过核心 lua_newstate
函数创建 Lua 状态。其他客户端可以使用适合其应用程序的任何内存分配方式。
2012-07-04 10:42:14
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
Lua 绝对使用
malloc
,以realloc
的形式(还可以传递自定义的分配器),然而,因为 Lua 使用类似于 99% 的基于 VM 的语言的 GC,它使用宏来自动添加 GC 标头块到分配中。你会发现 Lua 的内存都由
lmem.c
和lmem.h
中的LuaM_
例程处理,这些例程都使用 VM 的全局状态来存储分配器,它最初设置为l_alloc
(来自lauxlib.c
),但可以通过lua_setallocf
进行更改。最近,LuaJIT 添加了分配下沉,并计划一些非常酷的内存功能,你可以在这篇 LuaJIT 垃圾回收 文章中了解更多。该文章涵盖了关于 VM/JIT 内存分配、下潜、聚合和垃圾回收的很多策略和设计。
正如你所看到的,内存分配和下沉策略与你采用的 GC 密切相关(如果有的话)。
在各种内存 分配器 的利弊方面,使用标准的
malloc
很容易使用,但代价是速度慢和对齐和各种额外块的浪费。转向更先进的区域、池、砖块分配器,我们可以极大地加速事情(特别是针对固定大小的内部 VM 分配),避免像
malloc
这样的更通用的分配器可能出现的大量碎片化和开销,但当然这些分配器更复杂,并且如果从头开始,你必须对它们进行调试(在更大的系统中如 VM,这只会引发问题),而不是经过验证的 CRTmalloc
实现。