让我们假设我有一个列表< Rubrique> listRubriques与十个Rubrique对象.
Rubrique包含一个产品列表(List< product> listProducts)和一个客户端列表(List< Client> listClients).
如果我这样做,记忆中究竟发生了什么:
listRubriques.clear(); listRubriques = null;
我的观点是,由于listRubriques是空的,所以我先前被这个列表引用的对象(包括listProducts和listClients)将很快垃圾收集.但是由于Java中的Collection有点棘手,因为我的应用程序有很多性能问题,所以我问这个问题:)
编辑:现在让我们假设我的Client对象包含一个List< Client>.因此,我有一个对象之间的循环引用.如果我的listRubrique设置为null会发生什么?这一次,我的观点是我的Client对象将变得“不可达”,并可能会造成内存泄漏?
解决方法
这表示你的例子损害了实际的表现. listRubriques.clear()不需要(除了你在别的地方引用它),因为listRubrique所引用的一切都是垃圾的,因为listRubriques不再被引用.如果变量listRubriques超出范围(可能是因为它是一个本地变量,该方法在此结束),那么listRubriques = null也可能不需要.
不仅需要清除的调用,因为清除访问对象的内存不再使用,对象被访问,现代处理器将它放入其缓存.所以一个死对象是明确地去处理器缓存 – 一些可能更有用的数据将被覆盖为该操作.
This article是获取有关Java垃圾收集器的更多信息的好参考.
编辑:对问题的编辑做出反应:垃圾收集器(Sun至少使用的实现)从一些根引用开始,并将所有可以从此引用到达的对象复制并复制对象引用.所以你的循环引用的对象是垃圾,因为没有“外部”引用指向它们,并且内存将在垃圾回收中被回收.