什么是Java中的对象池?

什么是对象池以及什么是弱对象引用?

我们如何使用Java实现它们?

对象池是应用程序将创建并保留的特定对象的集合,用于创建每个实例的代价高昂的情况。 一个很好的例子是数据库连接或工作线程。 池为库中的书籍等用户检查实例。

通常,对象池由Java EE应用程序服务器处理。 如果您需要自己动手,最好使用Apache的对象池。 不要自己写一个; 线程安全和其他问题可能使它变得复杂。

这是弱对象引用的一个很好的参考。

检查公共池

提供了一个Object-pooling API

它通常用于创建昂贵的对象。 为了避免您维护N个预先创建的对象池并重用它们。

弱引用是一种由垃圾收集器专门处理的引用变量。

这引入了另一种可达性,任何对象可能是:

  • 强烈可达(只能通过普通引用从任何生命线程到达)
  • 弱可达(不可强,但可通过弱引用(或多种方式,每种方式包括弱引用))
  • 根本无法到达

(还有Soft ReferencesPhantom References ,我在这里省略了 – 它们的工作方式类似,介绍了更多层次。)

如果根本无法访问对象,则可以随时对其进行垃圾回收。 如果一个对象是强烈可达的,则根本不能对其进行垃圾收集。 如果垃圾收集器发现一个对象(或一组对象)是弱可达的(可能是多个弱引用), 它会立即清除所有这些引用 ,然后对象无法访问(并且可以被垃圾收集)。

(实际上,“不可到达”和集合之间可能存在/可能是最终确定步骤,这也可能使对象再次可达。)

对于使用弱引用,可以使用类java.lang.ref.WeakReference – 实际引用在此类的私有变量中,并且只能使用构造函数设置,然后清除。 如果您需要除引用本身之外的其他数据,则可以对此类进行子类化,当引用被清除时,它仍应存在。

对于“避免代价高昂的实例化”意义上的对象池,弱引用不是正确的工具。

对象池是任何对象的集合,它们被回收,而不是在每次需要时重新创建。

您可以通过多种方式根据需要实现此类对象池。 对象池用于帮助简单对象的性能,但在Java 5+中不那么有用。

我建议你只将它们用于与外部资源(如文件,套接字或数据库连接)连接的对象。

对象池模式的概念类似于库的概念。 我们每个人都知道更便宜,更容易去图书馆并借书而不是购买它。同样,对于借用对象而不是实例化它的过程来说,它更便宜(关于系统内存和速度)。 因此,进程从另一个进程借用对象的这种进程被称为对象池。

池和对象池:

池化基本上意味着通过将对象的访问限制到客户端所需的时间来有效地利用资源。

通过池化提高利用率通常会提高系统性能。
对象池是一种在竞争客户端之间管理对有限对象集的访问的方法。
换句话说,对象池只不过是在不同客户端之间共享对象。

由于对象池允许共享对象,因此其他客户端/进程需要重新实例化对象(这会减少加载时间),而是可以使用现有对象。
使用后,对象将返回池中。


弱参考对象:

弱引用是对称为引用对象的引用的持有者。
使用弱引用,您可以维护对引用的引用,而不会阻止它被垃圾回收。
当垃圾收集器跟踪堆时,如果对象的唯一未完成引用是弱引用,那么引用对象将成为GC的候选者,就好像没有未完成的引用并清除任何未完成的弱引用一样。

请记住,GC总是使用一些算法来回收弱可达对象。

我在Java中实现了一个简单的ObjectPool ,请参见此处它不使用弱对象引用。 弱对象引用的目的是允许收集对象内存,即使有对象的引用,但它们很弱。 它对于缓存比对象池更有用,尽管也可以用于它们。