我跟随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会在某个时候收集它们。
内存泄漏是指使用的内存不断增加的情况 - 没有对象有资格进行垃圾回收。
给出关于使用地图的“缓存”示例的评论:
引用您提供的链接:
你能发现内存泄漏吗?
我犯了一个错误。我拿了Long(包装类),这是内存泄漏的原因,而不是将原语长为总和。由于自动装箱,sum = sum + l;在每次迭代中创建一个新对象,因此将创建1000个不必要的对象。请避免在原始类和包装类之间混合和匹配。尝试尽可能多地使用原语。
实际上,这里没有内存泄漏。更好的说,它会产生一些冗余的内存使用和垃圾收集。
如果你想模拟真实的内存泄漏,请参考这个问题:Creating a memory leak with Java。
此外,由于忽略了adder.addIncremental(i);
,可能会对此代码进行一些JVM优化。
如果你看一下内存图,你会发现从GC循环到循环的内存使用情况非常稳定。
例如:
你能发现内存泄漏吗?
我犯了一个错误。我拿了Long(包装类),这是内存泄漏的原因,而不是将原语长为总和。由于自动装箱,sum = sum + l;在每次迭代中创建一个新对象,因此将创建1000个不必要的对象。
这个教程的引用是错误的。在这个例子中,你将没有内存泄漏,但只是没有高效的内存使用。