在谷歌代码上找到的一些库中,我遇到了这个util方法:
public static void gc(){
Object obj = new Object();
WeakReference ref = new WeakReference(obj);
obj = null;
while(ref.get()!=null)
System.gc();
}
它的doc说它提供了一种调用GC的可靠方法,因为调用System#gc()只是一个没有任何保证的提示.我把它展示给了我的大四学生,他说我应该考虑为什么这种方法无效.
我读了一些关于弱引用的文章,但我仍然感到困惑.
有人能告诉我这一点吗?
解决方法:
我对您发布的所谓“安全GC”习语有直接经验.
它不起作用.
原因很简单:只是清除弱ref的事实并不是收集对象的信号;它只意味着它通过任何强大或软的参考变得无法达到.根据我的经验,此信号在对象被回收之前到达.
更好的尝试是使用Phantom引用,这至少可以确保对象已进入可终结状态,但是再一次,它仍然可以占用堆,并且在实践中它仍然占据它.另一种解释可能是,这个显然存在于伊甸园空间的特定物体确实得到了回收,但GC运行并不是详尽无遗的,并且在其他几代人中有更多的记忆需要回收.
另一方面,我非常可靠地使用了这个琐碎的习语:
for (int i = 0; i < 3; i++) { System.gc(); Thread.sleep(500); }
试一试,看看它是否适合你.睡眠部分是可选的:仅当System.gc()使用并发扫描时才需要它.
如果你反对这种方法的明显变化无常,请记住任何显式GC-ing的方法都是变幻无常的.这个至少是诚实的 – 并且恰好在实际系统上工作.它自然是不可移植的,并且由于各种原因可以随时停止工作.即使这样,它也是你得到的最好的.
标签:java,garbage-collection
来源: https://codeday.me/bug/20190718/1492238.html