我正在关注 tutorial以下是自动装箱内存泄漏的示例。
package com.example.memoryleak;
public class Adder {
public long addIncremental(long l) {
Long sum=0L;
sum =sum+l;
return sum;
}
public static void main(String[] args) {
Adder adder = new Adder();
for(long ;i<1000;i++) {
adder.addIncremental(i);
}
}
}
现在,我可以理解由于自动装箱会创建不必要的对象,但它是如何导致内存泄漏的,我的理解是当您持有对死对象的强引用时会导致内存泄漏。现在,在这种情况下,一旦我退出 FOR 循环,就不会对那些 Long
对象进行强引用,那么它是如何导致内存泄漏的呢?
请注意,我想了解它是如何导致内存泄漏的,我知道那些对象是不必要的。
最佳答案
其他答案是正确的:这不是内存泄漏。
您显示的代码以非常高的速度创建对象;并且它们会立即进行垃圾回收。这些“临时”对象都不会以某种方式被遗忘;他们都有资格被收集; GC 会在某个时候收集它们。
内存泄漏是指已用内存不断增加的情况 - 而对象却没有达到垃圾回收的条件。
鉴于询问使用 map 的“缓存”示例的评论:
- 只要有一个单一的(强!)引用来自另一个在 GC 术语中“活着”的对象,该 map 就是“活着的”。因此:该 map 中存储的所有对象都处于 Activity 状态(不符合 GC 条件)
- 当对该映射的最后引用消失时,该映射本身就符合 GC 的条件。 map 中的值也是如此 - 除非有一些其他对仍然存在的值的引用。
关于java - 使用自动装箱的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44025220/