问题描述
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