我正在考虑一种方法来防止垃圾收集中的Java对象,即使它没有在合理的时间内被引用。
怎么做?
答案 0 :(得分:8)
在主类中有一个static
容器,用于引入对象。它可以是Map
,List
,无论如何。然后你将总是有一个对象的引用,它将不会被回收。 (为什么你想要这样做是另一个问题...)
也就是说:只要存在对象的可访问引用,就不会被垃圾收集。如果您的代码有引用并尝试使用它,那么该对象就在那里。你没有做任何特别的事情来实现这一点(你也不应该)。 (一个可达引用意味着引用来自某些东西,它本身可以从它引用的东西以外的东西到达。更简单地说:GC理解循环引用,因此可以清理A和B即使他们互相引用,只要其他任何一个都没有引用它们。)
答案 1 :(得分:8)
[...]即使没有被推荐合理的时间。
如果将来某个对象将被访问的任何机会,对象将不会被垃圾回收。
这是因为如果你有一个对象的引用,它将不会被垃圾收集,如果你没有有对象的引用,那就没有办法了你将能够访问它。
换句话说,普通引用永远不会神秘地转变为null
只是因为垃圾收集器发现该对象长时间未被访问并且认为是时候回收它了。
答案 2 :(得分:2)
您还可以在自己的类中创建对象的静态实例。例如,如果它是单例,则在类中具有静态实例字段。
答案 3 :(得分:2)
如果没有其他引用,有一些机制可以保存对象的引用,但仍允许它被垃圾回收。
查看WeakReference和SoftReference。如果您想了解有关jvm的可达性的更多详细信息,请参阅:
http://download.oracle.com/javase/6/docs/api/java/lang/ref/package-summary.html#reachability
就时间而言,垃圾收集器不知道或关心对象的使用频率。另一个对象都有对目标的引用(即使它没有使用它),或者没有对目标的引用。如果没有对该对象的引用,它将永远不会被再次使用,并且最终将被释放(即使您想要,也无法再次获得对该对象的引用)对象的生命周期越长,对象的生命周期越长由于世代垃圾收集,jvm需要释放它。
答案 4 :(得分:1)
我正在考虑一种方法来防止垃圾收集中的Java对象,即使它没有在合理的时间内被引用。
从表面上看,这个问题没有意义。如果没有引用对象(或者更准确地说,如果它不可访问),那么垃圾收集器将收集它。如果要防止对象被垃圾回收,则必须确保它是可访问的。 (实际上,它必须强烈可达以保证它不会被GC:请参阅@Austen Holmes的答案和他引用的页面。)
但实际上,我认为您对访问或使用的“引用”/引用/可访问感到困惑;即使用 act 访问字段或调用对象的方法。如果这就是您要求的,那么我可以确保垃圾收集器既不知道也不关心您的代码最近是否访问过/使用过对象。
可达性标准实际上是关于您的代码是否可以在将来的某个时间点访问该对象,以及(因此)是否需要保留该对象以使其起作用。可访问性规则意味着如果可以访问对象,则将保留。自上次访问它以来,它没有任何区别。