在具有自动内存管理的编程环境中,OS内存分配例程在运行时调用的频率是多少?

问题描述 投票:1回答:1

实现是否使用malloc为对象预分配内存块?当这些块用完时,会请求额外的内存吗?当垃圾收集运行并发生压缩时,是否会通过调用free将内存返回给操作系统?

memory memory-management garbage-collection virtual-machine
1个回答
4
投票

实现是否使用malloc为对象预先分配内存块?

是。大多数情况下,它们预先分配连续的内存块,并在内部实现它们自己的分配机制(例如,基于分配指针 - 指向下一个对象的内存地址,因此分配对象只是返回此地址并将指针移动给定的量字节)。这比依赖OS调用更快,并且可以更好地控制这些内存区域。例如,对于Windows上的CLR,这些块称为段,并通过VirtualAlloc / VirtualFree调用进行管理。首先保留一个相当大的内存区域,然后在需要时提交越来越多的页面。在CLR中不使用Malloc(或更一般的 - 在Windows情况下为HeapAPI)。

当这些块用完时,会请求额外的内存吗?

是的,它们可能会创建更多块,但首先它们通过提交(消耗)保留内存而“内部”增长。

当垃圾收集运行并发生压缩时,是否会通过免费调用将内存返回给操作系统?

它取决于特定的运行时实现,但您不应将其视为主内存回收机制。压缩在那些预分配的内存块中工作 - 例如,在压缩发生后,分配指针将移回到左侧。但是,是的,一般情况下,当GC决定不再需要它时(例如生活在里面的所有物体都已被回收),可以将段返回到操作系统。但是,在具有非常有限的虚拟内存空间的32位体系结构上,它可能导致不必要的内存碎片,并且重用这种内存块是更好的选择。在64位这可能不是一个大问题,然而,重用这些块仍然可能是一个好主意。

© www.soinside.com 2019 - 2024. All rights reserved.