Linux堆 - 正在进行大量的新/删除或者堆变得非常碎片化吗?

stu*_*uck 6 c linux heap gcc http-headers

我不熟悉Linux堆的分配方式.

我每秒多次调用malloc()/ free(),总是使用相同的大小(大约有10个结构,每个都是固定大小).除了初始化时间,我的记忆都没有长时间分配.

这被认为是标准堆的不良形式吗?(我相信有人会问'你用的是什么堆?' - '呃.标准的静态堆'..意思是我不确定.)

我是应该使用空闲列表还是堆容许大量相同的分配.我试图平衡可读性和性能.

有什么工具可以帮助我衡量吗?

R..*_*R.. 11

首先,除非你已经测量了内存使用的问题,否则不要考虑使用自定义分配器.这是过早优化的最糟糕形式之一.

同时,即使你遇到问题,比自定义分配器更好的解决方案是找出你为什么分配和释放对象这么多,并解决造成它的设计问题.

为了解决您的具体问题,glibc的分配器基于dlmalloc算法,该算法在碎片方面几乎是最优的.唯一可以让它严重破坏内存的方法是不可避免的方式:通过在交替中分配具有完全不同的生命周期的对象,例如分配大量对象但只释放其他对象.我认为你将很难制定出一种分配模式,这种分配模式会使总内存使用量低于池...

  • 我把它投了下来b/c它是居高临下的,看起来好像'R'没有读完我的整个帖子,然后才能获得高位.最后一段是有用的,直到他再次屈尊俯就并且没有提供他的事实 - 这样的回复如何得到如此高的投票,他们使stackoverflow充满了残余.我希望'R'没有假设我走的是一条糟糕的道路,而是假设我走在一条坚实的道路上并回答(或忽略)正在回答的问题. (2认同)

ks1*_*322 4

Valgrind 有一个特殊的工具Massif用于测量内存使用情况。这应该有助于分析堆分配。