0

在我的代码中,我一直在使用存储库的findAll查询 10k 个项目的列表。

我只分配了一个List引用,findAll然后为 的项目运行一个循环List

数据库中的总记录通常是 10K 的几倍,即循环当前迭代 6 到 12 次之间的某处。

我观察到的是,在大约 20K 读取项目之后,该循环中的连续处理开始花费更多时间。

List.addAll()如果我使用项目并且在添加下一个项目之前,我没有分配参考,而是使用然后迭代的执行时间保持不变并且不会连续增加findAll来清除列表。List.clear()

迭代时间增加的代码,

while(condition){
  List<T> reference = repo.findAll()
  for(T t:reference){
   //Processing 
  }
  //Check Condition if its false
}

恒定时间,

List<T> reference = new ArrayList<>();
while(condition){
  reference.addAll(repo.findAll())
  for(T t:reference){
   //Processing 
  }
reference.clear();
//Check Condition if its false
}

不知道为什么对象的间隙也应该在第一个实例中被垃圾收集?

相关问题 - list.clear() vs list = new ArrayList()

4

1 回答 1

-1

第一种方法会在每个循环中丢弃分配的后备数组,这将浪费大量时间进行 GC 和重新分配空间。

然而,第二个重用了后备数组并减少了 GC 和重新分配时间。

参考:为什么 ArrayList.clear() 方法不释放内存?

于 2018-09-27T13:34:58.563 回答