首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对象池设计模式会导致内存不足吗?

对象池设计模式会导致内存不足吗?
EN

Software Engineering用户
提问于 2020-08-28 15:05:34
回答 2查看 164关注 0票数 2

当我使用对象池设计模式,并允许池增长时,在需要但在池中不可用的时候创建新对象,并在使用对象池后将它们放置在池中,这最终会导致内存不足或某种内存不足/错误吗?

它看起来非常合理,在一段时间后,它将发生,因为池的增长,其中的对象不会被删除。

EN

回答 2

Software Engineering用户

发布于 2020-08-28 15:50:28

显而易见的解决办法是不要让池太大。

如果您的对象池正常工作,那么当对象不再需要时,您的程序应该已经将对象释放回池中,以便可以重用它们。如果您的池正在无限增长,这意味着您的对象池没有正确地管理对象,或者您的程序只是以这样一种方式设计:它使用太多的对象,或者在使用对象时不释放这些对象。

票数 7
EN

Software Engineering用户

发布于 2020-08-28 17:07:32

你的问题有点重复。夸张地说,你本质上是在问:“如果我一直分配内存,永远不还给它,我会继续分配内存,永远不会还给它吗?”答案很明显是“是的,如果你一直分配内存,永远不给它,你就会一直分配内存,永远不会还给它!”

对此有两个明显的解决方案:

  1. 不要一直分配内存。
  2. 把记忆还给我。

关于#1,对象池的思想是,您不创建新对象,而是重用已经在池中的对象。如果重用对象,显然不会分配新对象,因此从这个方向解决了问题。

关于#2,这意味着从池中删除对象。一个变化是,您对池中的对象使用弱引用,以便内存管理系统可以自行回收它们(假设您使用的语言具有内存管理系统)。

在具有自动内存管理的语言中,完全不使用对象池通常是一种选择。人们往往低估了现代高性能垃圾收集器的出色程度。25年前,Sun的JVM没有一个非常好的GC,所以有一些高性能的代码可以使用对象池。

现代GCs比25年前要好得多,而对象池实际上是现代GCs的最坏情况。现代GCs是建立在代际假设的基础之上的:大多数对象是年轻死亡的,旧的对象不引用新的对象,对象不会发生变异。对象池人为地保持对象的活力,因为对象被重用,旧对象很可能会引用新对象,当然,为了重用对象,您通常会对它们进行变异。

因此,完全有可能不仅对象池成为不必要的复杂因素,因为GC本身可能会做得很好,而且对象池可能实际上正在损害GC。

票数 6
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/415316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档