Java中的对象池是什么?

Java中的对象池是什么?,java,object-pooling,Java,Object Pooling,什么是对象池,什么是弱对象引用 我们如何使用Java实现它们?检查 提供对象池API 它通常用于创建费用昂贵的对象。为了避免您维护一个由N个预先创建的对象组成的池并重用它们。对象池是一个特定对象的集合,应用程序将创建该对象,并在创建每个实例非常昂贵的情况下保留该对象。一个很好的例子是数据库连接或工作线程。该池将实例签入和签出,以查找用户,如库中的图书 对象池通常由JavaEE应用服务器处理。如果您需要自己做,最好使用Apache的对象池之类的东西。不要自己写;线程安全和其他问题会使它变得复杂 弱

什么是对象池,什么是弱对象引用

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

检查

提供对象池API


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

对象池是一个特定对象的集合,应用程序将创建该对象,并在创建每个实例非常昂贵的情况下保留该对象。一个很好的例子是数据库连接或工作线程。该池将实例签入和签出,以查找用户,如库中的图书

对象池通常由JavaEE应用服务器处理。如果您需要自己做,最好使用Apache的对象池之类的东西。不要自己写;线程安全和其他问题会使它变得复杂


弱对象引用的良好引用。

对象池是回收的对象集合,而不是每次需要时重新创建

根据您的需求,有许多方法可以实现这样的对象池。对象池用于提高性能,即使对于简单对象也是如此,但在Java5+中没有那么有用


我建议您仅将它们用于连接到外部资源(如文件、套接字或数据库连接)的对象。

池和对象池:

池基本上意味着有效地利用资源,将对象的访问限制在客户端需要的时间段内

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

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


弱引用对象:

弱引用是对被称为referent的对象的引用的持有者。
对于弱引用,您可以在不阻止被垃圾收集的情况下维护对引用对象的引用。
当垃圾收集器跟踪堆时,如果对对象的唯一未完成引用是弱引用,则引用对象将成为GC的候选对象,就好像没有未完成的引用,并且清除任何未完成的弱引用一样


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

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

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

  • 强可访问(仅通过普通引用从任何生命线程可访问)
  • 弱可达(不强可达,但可通过弱引用(或通过多种方式,每种方式都包含一个弱引用)到达)
  • 根本达不到
(还有软引用和幻影引用,我在这里省略了它们——它们的工作原理类似,并且在它们之间引入了更多的级别。)

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

(实际上,“不可访问”和集合之间存在/可能存在一个终结步骤,这也可能使对象再次可访问。)

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

对于“避免昂贵的实例化”意义上的对象池,弱引用不是合适的工具。

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

对象池模式的思想与库模式类似。我们每个人都知道,去图书馆借书比买书更便宜、更容易。同样,进程借书比实例化对象更便宜(就系统内存和速度而言)。因此,这样一个进程从另一个进程借用对象的过程被称为对象池。

我怀疑您试图询问软引用缓存(而不是WeakReference)。我现在找不到它,但我记得有人读过一篇文章,他实现了一个专有的JVM,恳求人们不要使用它。他的论点是,这些缓存假设垃圾收集器的作者不知何故比您更了解您的缓存需求(这永远不会是真的)

我记得当时看到的是,如果GC循环没有释放足够的内存,所有软引用随后会立即被清除,即缓存从可笑的(内存不足)满变为(同样荒谬的)完全空。取而代之的是,选择一个基于大小、年龄或两者的缓存实现,即您可以给出自己的合理规则的缓存实现,而不是试图将缓存如何工作的决定转移给出于某种原因编写垃圾收集器的人。

(注意,如果您