当我使用对象池设计模式,并允许池增长时,在需要但在池中不可用的时候创建新对象,并在使用对象池后将它们放置在池中,这最终会导致内存不足或某种内存不足/错误吗?
它看起来非常合理,在一段时间后,它将发生,因为池的增长,其中的对象不会被删除。
发布于 2020-08-28 15:50:28
显而易见的解决办法是不要让池太大。
如果您的对象池正常工作,那么当对象不再需要时,您的程序应该已经将对象释放回池中,以便可以重用它们。如果您的池正在无限增长,这意味着您的对象池没有正确地管理对象,或者您的程序只是以这样一种方式设计:它使用太多的对象,或者在使用对象时不释放这些对象。
发布于 2020-08-28 17:07:32
你的问题有点重复。夸张地说,你本质上是在问:“如果我一直分配内存,永远不还给它,我会继续分配内存,永远不会还给它吗?”答案很明显是“是的,如果你一直分配内存,永远不给它,你就会一直分配内存,永远不会还给它!”
对此有两个明显的解决方案:
关于#1,对象池的思想是,您不创建新对象,而是重用已经在池中的对象。如果重用对象,显然不会分配新对象,因此从这个方向解决了问题。
关于#2,这意味着从池中删除对象。一个变化是,您对池中的对象使用弱引用,以便内存管理系统可以自行回收它们(假设您使用的语言具有内存管理系统)。
在具有自动内存管理的语言中,完全不使用对象池通常是一种选择。人们往往低估了现代高性能垃圾收集器的出色程度。25年前,Sun的JVM没有一个非常好的GC,所以有一些高性能的代码可以使用对象池。
现代GCs比25年前要好得多,而对象池实际上是现代GCs的最坏情况。现代GCs是建立在代际假设的基础之上的:大多数对象是年轻死亡的,旧的对象不引用新的对象,对象不会发生变异。对象池人为地保持对象的活力,因为对象被重用,旧对象很可能会引用新对象,当然,为了重用对象,您通常会对它们进行变异。
因此,完全有可能不仅对象池成为不必要的复杂因素,因为GC本身可能会做得很好,而且对象池可能实际上正在损害GC。
https://softwareengineering.stackexchange.com/questions/415316
复制相似问题