首页 > 解决方案 > 使用 new 关键字返回对象时对内存有严重影响吗?

问题描述

这段代码是不是因为new多次使用关键字而占用大量内存空间?

private static LinkedList<String> removeDuplicates(LinkedList<String> linkedList) {
    return new LinkedList<>(new HashSet<>(linkedList));
}

标签: javaobjectmemoryreturn

解决方案


我认为你正在以错误的方式思考这个问题。

从技术角度来看,虽然new确实会分配内存,但您不能仅通过计数new语句来说明使用了多少。它更多地取决于您分配的对象的类型,以及构造函数的作用。

例如:

  • new HashSet<>(linkedList)用列表的元素填充散列集。使用的内存取决于集合中唯一元素的数量。

  • new LinkedList<>(someCollection)用集合的元素填充链表。使用的内存取决于集合中元素的数量。

  • new ArrayList<>(someCollection)用集合的元素填充数组列表。使用的内存取决于集合中元素的数量,但它明显小于LinkedListHashSet


然后我们需要考虑对象的生命周期。在您的示例中,没有保留对中间体HashSet的引用,因此(除非它很大)它将在下次进行少量垃圾收集时被回收。

对于无法在第一次垃圾收集中幸存的对象,分配/收集的开销要小得多。


那么我们能学到什么?

  1. 很难概括内存分配的影响。

  2. 数据结构的选择可能比计数更重要new

  3. 由于 Java 从一开始就被设计为垃圾收集,因此纠结于“使用”了多少内存是没有效率的。特别是,除非您对语言、库和垃圾收集器的工作方式有很好的了解。如果你试图对抗语言,你的代码很可能会很复杂,最终可能会出现意想不到的性能和其他问题;例如,如果您尝试“对象池”。

  4. 即使您确实对这些事情有很好的感觉,(IMO)最好使用内存分析器等来识别代码的内存分配模式挥霍的地方。


推荐阅读