vmware 虚拟机实际使用的内存超过分配的内存在使用啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vmware 虚拟机实际使用的内存超过分配的内存在使用啥?相关的知识,希望对你有一定的参考价值。

我的PC物理内存4G,分配给虚拟机2G,虚拟机运行起来后,在虚拟机里看内存使用,实际已经超过3G,那么超过我分配给他的那1G是在使用什么?是使用硬盘虚拟内存?还是使用我PC的物理内存呢?

物理内存2G
其他是虚拟机的虚拟内存(硬盘)
参考技术A 既然是虚拟机 当然不是使用物理内存了

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

【中文标题】现代虚拟机如何处理内存分配?【英文标题】:How do modern VMs handle memory allocation? 【发布时间】:2012-07-04 15:56:45 【问题描述】:

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

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

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

它只打印了一些名称中包含malloc 字样的 Lua 宏。 Lua VM(和编程语言)根本不使用malloc

所以这引出了一个问题: Lua 如何从堆中分配内存?除了malloc,还有其他分配方式吗?其他方法的优缺点是什么?

我还想知道安全处理分配的内存的最佳实践、设计模式等。我在 Lua 的源代码中看到在分配内存之前有很多间接性。我在哪里可以了解这些东西?

【问题讨论】:

您对哪种虚拟机感兴趣?你知道,有些虚拟机可以虚拟化整个计算机。你也在问这些吗? @AlexeyFrunze,不,我只对用于编程语言的虚拟机感兴趣。 好的,标题看起来很混乱。 这是真正应该迁移到programmers.se的罕见问题之一吗? @finnw 问题被错误地迁移到programmers.se 是否很常见? 【参考方案1】:

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

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

最近,LuaJIT 添加了分配下沉,并计划了一些非常酷的内存功能,您可以在LuaJIT Garbage Collection 上阅读这篇文章。这篇文章涵盖了许多围绕 VM/JIT 内存分配、下沉、聚合和垃圾收集的策略和设计。

如您所见,内存分配和下沉策略与使用的 GC(如果有的话)密切相关。

就各种内存分配器的优缺点而言,使用标准malloc 使用起来很简单,但代价是速度和浪费对齐以及每个分配上标记的各种额外块.

转向更高级的 arena、pool、slab 和 block 分配器,我们可以显着加快速度(尤其是对于固定大小的内部 VM 分配)并避免使用更通用的分配器(例如 @)可能发生的大量碎片和开销987654331@,但当然这些分配器更复杂,如果你从头开始,你必须调试它们(在像 VM 这样的更大系统中,这只是在问问题),与久经考验的 CRT 相对应@ 987654332@实现。

【讨论】:

谢谢,你能用malloc告诉我它在哪里吗,因为就像我说的那样,我找不到它。我打算从 malloc 中跟踪代码,以便更好地了解内部结构。 @sinan:让我快点把它挖出来 谢谢,但realloc 不需要malloccalloc 电话吗?所以应该有一些malloccalloc 调用.. 是的,但是 LUA 源代码不包含 realloc 源代码,因为 realloc 是标准函数,并且是 C 运行时的一部分。要查看 realloc 源代码,您必须下载 glibc 的源代码,如果我没记错的话。 @sinan 不,您可以使用realloc(3),而无需使用malloc(3)。来自手册页:如果 ptr 为 NULL,realloc() 与对 malloc() 的 size 字节调用相同。【参考方案2】:

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

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

【讨论】:

以上是关于vmware 虚拟机实际使用的内存超过分配的内存在使用啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在vmware上装的linux系统反应很慢?

JAVA虚拟机内存分配与回收机制

VmWare如何导入已有VMDK虚拟机文件

浅析VMware虚拟化平台内存管理

VMware虚拟机突然CPU高占用,内存异常?

安装vm虚拟机的时候提示cpu不支持该怎么办。。。