在java中防止数组列表中的内存泄漏

问题描述

我有一个场景如下:

class Example {

  private List<Long> timeFrames;  //  Line 2

  private Example() {
    this.timeFrames = new ArrayList<>();
  }

  public static Example getExample() { return new Example();  }

  ...
  
  public Integer startTimeFrame() {
    Long startTimeStamp = new Date().getTime();
    this.timeFrames.add(startTimeStamp);
    return this.timeFrames.indexOf(startTimeStamp);
  }

  public Long stopTimeFrame(Integer timeFrameIdentifier){
    Long startTimeStamp = this.timeFrames.get(timeFrameIdentifier);
    return new Date().getTime() - startTimeStamp;
  }

}

现在,在代码审查期间,我的架构师在第 2 行给出了以下评论 - “这可能是内存泄漏的原因,因为您从未清除元素”

我们该如何处理?

编辑:

我已经更新了 Java 代码。 实际上,我们在 Node Js 中有代码,我们正在将其转换为 Java。

在 Node Js 代码中,我们有如下的“stopTimeFrame()”方法

  public stopTimeFrame(timeFrameIdentifier: number): number {
    const startTimeStamp = this.timeFrames.splice(timeFrameIdentifier,1)[0]

    return new Date().getTime() - startTimeStamp;
  }

因此,在 Node Js 代码中,他们使用的是“Splice()”方法。 我对 Node Js 了解不多。所以我只是用谷歌搜索了 Node Js 中 splice() 的用法

根据文档(w.r.t 上述代码),splice() 方法在位置 'timeFrameIdentifier' 添加新项目并删除 1 个项目。

所以,我认为我的审阅者说我没有清除元素时是这个意思。

你能帮助我如何转换 Java 中的“stopTimeFrame()”方法,使其功能与 Node Js 中的相同(它每次都使用 splice() 删除一个项目)?

解决方法

只需确保从列表中删除未使用的框架即可。该实现确实删除了对已删除 Long 对象的引用,因此如果没有其他对它们的引用,垃圾收集器可以在需要时处理它们。那么就不会出现内存泄漏。

例如,这里是 remove 方法之一的实现:

public E remove(int index) {
    rangeCheck(index);

    modCount++;
    E oldValue = elementData(index);

    int numMoved = size - index - 1;
    if (numMoved > 0)
        System.arraycopy(elementData,index+1,elementData,index,numMoved);
    elementData[--size] = null; // clear to let GC do its work

    return oldValue;
}

你注意到这一行:

    elementData[--size] = null; // clear to let GC do its work