【问题标题】:Does it badly affect to memory When returning an object with new keyword? [closed]使用 new 关键字返回对象时对内存有严重影响吗? [关闭]
【发布时间】:2021-04-04 22:16:01
【问题描述】:

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

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

【问题讨论】:

  • 一般回答:不,返回这样的“新”对象不是内存问题。在这种情况下,如果输入列表包含许多元素,可能会有些顾虑,但首先要注意的是代码是否正确。记忆排在第二位。
  • 这真的取决于集合的大小和它的持续时间。垃圾收集器在正常情况下会删除未使用的对象,但是,如果您的代码没有以适当的方式处理您的收集,它很容易耗尽内存。
  • You shouldn't specify LinkedList,事实上如果你使用ArrayList作为你的返回值,你会使用更少的内存。

标签: java object memory return


【解决方案1】:

我认为你的想法是错误的。

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

例如:

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

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

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


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

对于没有在第一次垃圾回收中幸存下来的对象,分配/回收的开销要小得多。


那么我们能学到什么?

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

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

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

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

【讨论】:

  • 我同意上述条款。问题来了,我真的必须使用这两个集合来进行一些快速的代码更新,并且需要确定影响。非常感谢!
【解决方案2】:

它制作 2 个副本。这会“严重影响”记忆吗?好吧,如果您有一个包含 40 亿个项目的列表,并且您运行它,那么您至少需要大约 8GB 的​​空间。如果你通过它运行一个包含 50 个项目的列表,谁在乎呢?

更重要的是,你为什么要这样做?

当你这样做时,排序完全被破坏了,因为HashSet 不维持秩序。 LinkedList 几乎总是错误的(它比 arraylist 有理论上的性能提升。这些理论上的提升基本上从未在实际的 PC 硬件上真正实现过;相反,它很慢。只需使用 ArrayList),如果你想要唯一性,为什么不开始从一开始就使用 HashSet?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    相关资源
    最近更新 更多