ArenaAllocators 与 ArrayLists 的内存陷阱

ArenaAllocators don't play nicely with ArrayLists

在使用 ArenaAllocators 时,很多人以为 free 操作能轻松回收内存,但实际情况要复杂得多。只有当释放的内存是最后分配的,且来自 Arena 的当前节点时,内存才会真正归还。而 ArrayList 在扩容时,会先分配新内存、复制数据,再释放旧内存,这导致旧内存不再是最后分配的,从而无法被 Arena 回收。即使不穿插其他分配操作,ArrayList 的扩容机制也会让 ArenaAllocators 的内存回收失效。虽然无法彻底解决,但可以通过预设容量或避免混合分配来缓解问题。否则,最坏情况下内存占用可能达到预期的三倍。

即使你不将其他分配操作与 ArrayList 的扩容穿插在一起,分配加复制再加释放的机制也保证了旧内存不再是最后分配的内存。

同日更多故事

2026-08-12