不确定如何标题,但问题是:
我听说过程序员在程序开始时分配大部分连续内存,然后在必要时将其处理掉。这与每次需要内存时简单地访问操作系统形成对比。 我听说这会更快,因为它可以避免不断向操作系统询问连续内存块的成本。
我相信JVM会这样做,维护自己的内存部分,然后从中分配对象。
我的问题是,如何实际实现这一目标?
谢谢, dragonwrenn
答案 0 :(得分:14)
大多数C和C ++编译器已经提供了堆内存管理器作为标准库的一部分,因此您根本不需要做任何事情以避免每次请求都触及操作系统。
如果你想提高性能,你可以简单地链接和使用一些改进的分配器。例如Hoard,哪个小伙子在一个现已删除的答案中提到(实际上非常好 - 小麦,为什么要删除它?)。
如果您想编写自己的堆管理器作为学习练习,以下是它需要做的基本事情:
答案 1 :(得分:6)
您可以在程序开头分配一大块内存,以满足其需求。然后你必须覆盖new和/或malloc,delete和/或free来从/向这个缓冲区返回内存。
实现这种解决方案时,您需要编写自己的分配器(从块中获取源代码),并且最终可能会使用多个分配器,这通常是您首先分配内存池的原因。
默认内存分配器是一个很好的全面分配器,但不是最适合所有分配需求。例如,如果您知道要为特定大小分配大量对象,则可以定义一个分配器,该分配器分配固定大小的缓冲区并预先分配多个以获得一定效率。
答案 2 :(得分:3)
这是经典的分配器,也是非多线程使用的最佳之一:
http://g.oswego.edu/dl/html/malloc.html
通过阅读其设计说明,您可以学到很多东西。
话虽如此,除非你的程序有非常不寻常的分配模式,否则编写自己的分配器或使用自定义分配器可能是一个非常糟糕的主意。特别是如果您尝试替换系统malloc
,则可能会将来自不同库(或标准库函数)的各种错误和兼容性问题与“错误版本的malloc
”链接起来。 / p>
如果您发现自己只需要针对少数特定任务进行专门分配,则可以在不替换malloc
的情况下完成。我建议为固定大小的对象查找GNU obstack
和对象池。这些涵盖了大多数专业分配可能具有实际用途的案例。
答案 3 :(得分:1)
答案 4 :(得分:1)
IBM developerWorks有一篇关于内存管理的好文章,有一个广泛的资源部分供进一步阅读:Inside memory management。
维基百科也有一些很好的信息:C dynamic memory allocation,Memory management。