我有一个场景如下:
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()删除一个项目)吗?
2条答案
按热度按时间oalqel3c1#
只要确保从列表中删除了未使用的帧。实现确实删除了对已删除
Long
对象的引用,以便在没有其他引用的情况下,垃圾收集器可以在需要时处理它们。这样就不会出现内存泄漏。例如,下面是
remove
方法之一的实现:你注意到这一行:
1tuwyuhd2#
我认为
stopTimeFrame()
应该从timeFrames
列表中删除元素,因为您只能从那里获得元素,它仍然存在。例如:
timeFrames.removeIf(tf -> tf.equals(startTimeStamp));
.如果您的收藏有重复的元素-如果它们符合条件,则将全部删除。