Java集合和垃圾收集器

前端之家收集整理的这篇文章主要介绍了Java集合和垃圾收集器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
关于 Java Web应用程序中的性能的一个小问题.

让我们假设我有一个列表< 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对象将变得“不可达”,并可能会造成内存泄漏?

解决方法

实际的Java实现的Java实现对所有引用/活动对象不时地进行复制.复制的空间可以再次用于内存分配.

这表示你的例子损害了实际的表现. listRubriques.clear()不需要(除了你在别的地方引用它),因为listRubrique所引用的一切都是垃圾的,因为listRubriques不再被引用.如果变量listRubriques超出范围(可能是因为它是一个本地变量,该方法在此结束),那么listRubriques = null也可能不需要.

不仅需要清除的调用,因为清除访问对象的内存不再使用,对象被访问,现代处理器将它放入其缓存.所以一个死对象是明确地去处理器缓存 – 一些可能更有用的数据将被覆盖为该操作.

This article获取有关Java垃圾收集器的更多信息的好参考.

编辑:对问题的编辑做出反应:垃圾收集器(Sun至少使用的实现)从一些根引用开始,并将所有可以从此引用到达的对象复制并复制对象引用.所以你的循环引用的对象是垃圾,因为没有“外部”引用指向它们,并且内存将在垃圾回收中被回收.

原文链接:https://www.f2er.com/java/123757.html

猜你在找的Java相关文章