我有以下代码
Vehicle v= new Vehicle();
Car car = v.getCar();
v.clear();
车辆中的clear()是
clear()
{
car=null;
}
我试图确保在我调用clear()
之后,没有其他人可以访问汽车对象。我可以像上面那样将它设置为null,但它不会阻止任何其他人保持对它的引用,并且仍然可以访问内存位置以获取数据。
我不想打电话给System.gc()
用例是,在注销后,我需要清除存储在内存中的所有内容。存储机制也是单例。即使我避免使用单身,这个问题仍然存在
答案 0 :(得分:4)
只要您提供对外国来电者的参考,您就可以忘记管理其指定对象生命周期的任何希望。调用System.gc()
将是徒劳的,因为垃圾收集器不会触及可到达的对象。
您必须设计应用程序,以便永远不会公开对要在注销时取消分配的对象的引用。通常这是一个非常高的订单,所以你应该三思而后行。
答案 1 :(得分:1)
呼叫System.gc()
无论如何也无济于事。它并不意味着被程序调用,它的效果很小(是的,在某些情况下它是合理的,但这很少见。)
如果你在某处提供参考,你永远不知道是谁拥有它。当然你可以尝试使用WeakReferences
进行一些skullduggery,但这没有用,因为你可以从中得到强有力的参考。
你唯一的机会是设计你的程序,这样你就不会给出引用,否则你无法阻止别人抓住它们。
答案 2 :(得分:0)
你觉得这个怎么样?如果要清理它时另一个线程正在使用该对象,该怎么办?是否只是在操作中途消失了?在这种情况下,System.gc()
将不会为您做任何事情 - 如果有参考GC不会清除它,如果没有,它将在以后清除它。
确保在Java中将对象清除内存的唯一正确方法是通过可靠的设计,当您不再需要它时,您可以停止持有对象(现在不讨论JVM错误) 。如果要在注销时清除内存,请在注销时清除所有引用。
可以通过Soft,Weak或Phantom引用实现一些额外的控制,因为您可以保留对象并且不会阻止GC,但是您不能强制GC在特定对象上。