如何正确清理记忆?

时间:2014-04-11 11:03:51

标签: java garbage-collection

我有以下代码

Vehicle v=  new Vehicle();
Car car = v.getCar();
v.clear();

车辆中的clear()是

clear()
{
    car=null;
}

我试图确保在我调用clear()之后,没有其他人可以访问汽车对象。我可以像上面那样将它设置为null,但它不会阻止任何其他人保持对它的引用,并且仍然可以访问内存位置以获取数据。

我不想打电话给System.gc()

用例是,在注销后,我需要清除存储在内存中的所有内容。存储机制也是单例。即使我避免使用单身,这个问题仍然存在

3 个答案:

答案 0 :(得分:4)

只要您提供对外国来电者的参考,您就可以忘记管理其指定对象生命周期的任何希望。调用System.gc()将是徒劳的,因为垃圾收集器不会触及可到达的对象。

您必须设计应用程序,以便永远不会公开对要在注销时取消分配的对象的引用。通常这是一个非常高的订单,所以你应该三思而后行。

答案 1 :(得分:1)

呼叫System.gc()无论如何也无济于事。它并不意味着被程序调用,它的效果很小(是的,在某些情况下它是合理的,但这很少见。)

如果你在某处提供参考,你永远不知道是谁拥有它。当然你可以尝试使用WeakReferences进行一些skullduggery,但这没有用,因为你可以从中得到强有力的参考。

你唯一的机会是设计你的程序,这样你就不会给出引用,否则你无法阻止别人抓住它们。

答案 2 :(得分:0)

你觉得这个怎么样?如果要清理它时另一个线程正在使用该对象,该怎么办?是否只是在操作中途消失了?在这种情况下,System.gc()将不会为您做任何事情 - 如果有参考GC不会清除它,如果没有,它将在以后清除它。

确保在Java中将对象清除内存的唯一正确方法是通过可靠的设计,当您不再需要它时,您可以停止持有对象(现在不讨论JVM错误) 。如果要在注销时清除内存,请在注销时清除所有引用。

可以通过Soft,Weak或Phantom引用实现一些额外的控制,因为您可以保留对象并且不会阻止GC,但是您不能强制GC在特定对象上。