Java从堆中取消分配对象

时间:2011-04-06 13:27:59

标签: java memory-management heap

在Java中,要从堆中卸载对象,只需编写myObject = null;就足够了,GC会从那里处理它吗?

编辑:好的让我解释一下我的用例,因为每个人都假设我不应该明确地将对象置空,我不应该担心它等等。这是错过了重点。我正在序列化一个对象,并在序列化它之前“消耗”该对象的一个​​字段以节省磁盘空间。在你为此跳下我的喉咙之前,我也不能声明这个字段transient因为我有时会在对象中包含这个字段,而不是其他字段。

将对象设置为null会对GC产生影响吗?

3 个答案:

答案 0 :(得分:4)

在一些现代虚拟机中,主动设置对null的引用会阻碍垃圾收集器。你应该忘记这一点。

要知道对象何时被垃圾收集,请查看java.lang.ref包 - 尽管我可以诚实地说,在16年的Java编程中,我从来不需要知道对象何时被垃圾收集。 / p>

你能详细说明为什么你认为你需要这个吗?

答案 1 :(得分:1)

没有; 对该对象的所有引用必须丢失/为空。在实践中,这是你不应该担心的事情。

当您的对象不再使用时将被取消分配。请注意,留给对象的任何引用都会将对象保留在堆上,只需将null赋给任何单个引用都不会导致底层对象神奇地消失。

答案 2 :(得分:0)

不,不。 myObject = null;仅在没有对该对象的其他引用时才有用,并且在大多数情况下它是多余的,因为本地对象在每个方法的末尾都超出了范围。

至于实际取消分配对象的时间,这完全取决于GC。您可以做的是添加一个finalize method,它将在对象被释放之前调用,但这也是有问题的,不应该依赖它。