如何保持Java对象的存活?

我正在考虑一种方法来防止垃圾收集中的Java对象,即使它没有在合理的时间内被引用。

怎么做?

[…]即使它没有被推荐一段合理的时间

如果将来有可能访问某个对象,那么该对象将不会被垃圾回收

这是因为如果你有一个对象的引用,它将不会被垃圾收集,如果你没有对象的引用,你将永远无法访问它。

换句话说,普通引用永远不会神秘地转变为null只是因为垃圾收集器观察到该对象长时间未被访问并认为是时候回收它了。

在主类中有一个static容器,您可以在其中放置对象的引用。它可以是MapList等等。 然后你将总是有一个对象的引用,它将不会被回收。 ( 为什么你想这样做是另一个问题…)

也就是说:只要存在对象的可访问引用,就不会对其进行垃圾回收。 如果您的代码有一个引用并尝试使用它,那么该对象就在那里。 你没有做任何特别的事情来实现这一点(你也不应该)。 ( 可达参考意味着引用来自某些东西,它本身可以从它引用的东西之外的其他东西到达。更简单地说:GC理解循环引用,因此即使它们引用每个参考也可以清理A和B.另外,只要没有其他任何一个指代其中任何一个。)

您还可以在自己的类中创建对象的静态实例。 例如,如果它是单例,则在类中具有静态实例字段。

有一些机制可以保存对象的引用,但如果没有其他引用则仍然允许它被垃圾回收。

看看WeakReference和SoftReference。 如果您想了解有关jvm的可达性的更多详细信息,请参阅:

http://download.oracle.com/javase/6/docs/api/java/lang/ref/package-summary.html#reachability

就时间而言,垃圾收集器不知道或不关心对象的使用频率。 另一个对象都有对目标的引用(即使它没有使用它),或者没有对目标的引用。 如果没有对该对象的引用,它将永远不会被再次使用,并且最终将被释放(即使您想要,也无法再次获得对该对象的引用)对象的生存时间越长,对象的生命周期越长由于世代垃圾收集,jvm需要释放它。

我正在考虑一种方法来防止垃圾收集中的Java对象,即使它没有在合理的时间内被引用。

从表面上看,这个问题没有意义。 如果没有引用对象(或者更准确地说,如果它不可访问),那么垃圾收集器将收集它。 如果要防止对象被垃圾回收,则必须确保它是可访问的。 (实际上,它必须能够很好保证它不会被GC控制:请参阅@Austen Holmes的答案和他引用的页面。)

但实际上,我认为你对访问或使用的“引用”/引用/可访问感到困惑; 即通过访问字段或调用对象的方法的行为 。 如果这就是您所要求的,那么我可以确保垃圾收集器既不知道也不关心您的代码最近是否访问过/使用过对象。

可达性标准实际上是关于您的代码是否可以在将来的某个时间点访问该对象,以及(因此)是否需要保留该对象以使其可用。 可达性规则意味着如果可以访问某个对象,那么它将被保留。 自上次访问它以来,它没有任何区别。