内存泄漏使用自动装箱

pjj*_*pjj 5 java memory garbage-collection memory-leaks memory-management

我正在按照教程,下面是自动装箱内存泄漏的例子.

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);
      }
    }
 }
Run Code Online (Sandbox Code Playgroud)

现在,我可以理解,由于自动装箱会产生不必要的对象,但它如何导致内存泄漏,我理解的方式是当你持有对死对象的强引用时会导致内存泄漏.现在,在这种情况下,一旦我从FOR循环中出来,就没有对这些Long对象的强引用,那么它是如何导致内存泄漏的?

请注意我想了解它是如何导致内存泄漏的,我知道这些对象是不必要的.

Gho*_*ica 8

其他答案是正确的:这不是内存泄漏.

您显示的代码以非常高的速率创建对象; 他们立即受到垃圾收集.这些"临时"物体都没有被遗忘; 他们都有资格收藏; GC会在某个时候收集它们.

内存泄漏是指使用的内存不断增加的情况 - 没有对象有资格进行垃圾回收.

给出关于使用地图的"缓存"示例的评论:

  • 只要在GC术语中对来自另一个"活着"的对象的地图对象有一个(强!)引用,该地图就是"活着的".因此:存储在该地图中的所有对象都是活动的(不适用于GC)
  • 当对该地图的最后一次引用消失时,地图本身就有资格进行GC.对于地图中的值也是如此 - 除非存在对此类仍然存活的值的其他引用.