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

Memory 在具有自动内存管理的编程环境中,在运行时调用操作系统内存分配例程的频率是多少?,memory,memory-management,garbage-collection,virtual-machine,Memory,Memory Management,Garbage Collection,Virtual Machine,实现是否使用malloc为对象预先分配内存块?当这些块用完时,是否会请求额外的内存?当垃圾收集运行并进行压缩时,内存是否会通过调用free返回操作系统 实现是否使用malloc为对象预先分配内存块 对。大多数情况下,它们预先分配连续的内存块,并在内部实现自己的分配机制(例如,基于分配指针-指向下一个对象的内存地址,因此分配对象只是返回该地址并将该指针移动给定的字节数)。这比依赖操作系统调用更快,并且可以更好地控制这些内存区域。例如,对于Windows上的CLR,这些块称为段,并通过Virtual

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

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

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

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

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

当垃圾收集运行并进行压缩时,内存是否会通过调用free返回操作系统

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

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

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

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

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

当垃圾收集运行并进行压缩时,内存是否会通过调用free返回操作系统


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

频率本身并不重要。想象一下,分配内存只需要一条指令,这比使用内存做任何事情都要便宜。通常,相对于内存管理开销和延迟,应用程序吞吐量被认为比任何此类原语的原始调用频率更重要。频率本身并不重要。想象一下,分配内存只需要一条指令,这比使用内存做任何事情都要便宜。通常,相对于内存管理开销和延迟,应用程序吞吐量被认为比任何此类原语的原始调用频率更重要。