如何让对象被垃圾回收?

时间:2016-08-08 07:06:14

标签: java garbage-collection bytebuffer

我在hashmap中有一些对象。这些对象包含bytebuffer。现在我想要释放那些bytebuffers。因此,如果我只是将hashmap引用为null,它将启用所有准备好进行垃圾回收的对象并释放缓冲区。或者我需要明确地将所有这些都归零。

3 个答案:

答案 0 :(得分:1)

从根本上说,它归结为可达性。如果通过一系列(正常的 1 )引用无法访问某个对象,那么从代码中的某些内容(a - > b - > c)开始,那么它就符合条件对于GC。如果可以,那就不是。一旦没有任何内容引用您的对象,bytebuffer就有资格获得GC,因为无法访问它。

  

我在hashmap中有一些对象。

我会假设他们是价值而不是钥匙。 (这仅取决于您是从HashMap中删除条目还是仅将密钥值设置为null

  

因此,如果我只是将hashmap引用为null,它将启用所有准备好进行垃圾回收的对象并释放缓冲区。或者我需要明确地将所有这些都归零。

您只需释放您的对象,例如,完全从HashMap删除条目,或将条目的值设置为null,这将释放HashMap的引用你的对象。如果这是对象的唯一引用,则您的对象符合GC的条件;如果你的对象是唯一引用了bytebuffer的东西,那么它也有资格获得GC。您不必在对象中显式释放对bytebuffer的引用。

代码值1024字,所以:

class Thingy {
    private byte[] buffer;

    MyObject() {
        this.buffer = new byte[1024];
    }
}

其他地方:

Map<String, Thingy> m = new HashMap<>();

m.put("foo", new Thingy());
// At this point, the HashMap refers to the Thingy, and the Thingy refers to the
// buffer, so neither of them is eligible for GC

m.remove("foo"); // or m.put("foo", null) if that's really appropriate
// At this point, nothing refers to the Thingy anymore, and so both the Thingy and
// its buffer are eligible for GC

1 Java具有weak references的概念,这是此规则的一个例外。它们允许对象进行GC,即使可以从包含它们的WeakReference中检索对象(此时无法再通过WeakReference访问该对象。)

答案 1 :(得分:0)

如果程序中的任何地方没有引用,则这些对象可以进行垃圾回收。 发生这种情况的时间高度取决于使用过的垃圾收集器。

答案 2 :(得分:0)

是的,它们将被垃圾收集,除非您有其他参考(可能是手动)。如果您只是对地图的引用,那么是的,它们将被垃圾收集。

我的想法:

如果我打电话:myMap = null; 地图内相关的Hashmap键或值对象会发生什么? 它们是否也会被垃圾收集,或者我必须在myMap对象中设置null所有相关对象?

假设myMap包含一些其他对象仍可访问的键和值。 然后,

  • 没有立即发生。
  • 如果这些键和值只能通过地图访问,那么它们现在无法访问,并且有资格进行垃圾回收。 (在这种情况下,不需要为对内部对象的引用赋值null。)
  • 但是,如果内部节点可通过其他路径到达,则可能仍然可以访问它们,因此不符合垃圾回收的条件。如果你把地图设为null也不会被垃圾收集。