我在hashmap中有一些对象。这些对象包含bytebuffer。现在我想要释放那些bytebuffers。因此,如果我只是将hashmap引用为null,它将启用所有准备好进行垃圾回收的对象并释放缓冲区。或者我需要明确地将所有这些都归零。
答案 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包含一些其他对象仍可访问的键和值。 然后,