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

eqqqjvef  于 2023-02-07  发布在  Java
关注(0)|答案(2)|浏览(198)

我有一个场景如下:

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代码。实际上我们在节点Js中有代码,我们正在将其转换为Java。
在节点Js代码中,我们有如下的"stopTimeFrame()"方法:

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

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

所以,在节点Js的代码中,他们使用的是'Splice()'方法。我对节点Js没有太多的了解。所以我只是在谷歌上搜索了一下节点Js中splice()的用法。
根据文档(关于上述代码),splice()方法在"timeFrameIdentifier"位置添加新项并删除1项。
所以,我想我的评论者说我没有清除元素时是这个意思。
你能帮我转换Java中的"stopTimeFrame()"方法,使其功能与Node Js中的相同(每次使用splice()删除一个项目)吗?

oalqel3c

oalqel3c1#

只要确保从列表中删除了未使用的帧。实现确实删除了对已删除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
1tuwyuhd

1tuwyuhd2#

我认为stopTimeFrame()应该从timeFrames列表中删除元素,因为您只能从那里获得元素,它仍然存在。
例如:
timeFrames.removeIf(tf -> tf.equals(startTimeStamp));.
如果您的收藏有重复的元素-如果它们符合条件,则将全部删除。

相关问题