java gc手工调用_Java:可靠地调用GC?

本文探讨了一个声称能够可靠触发Java垃圾回收(GC)的Util方法。通过分析弱引用和幻影引用的工作原理,揭示了该方法的局限性,并提供了一个更实用的GC触发示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在谷歌代码上找到的一些库中,我遇到了这个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值