List.clear()与参考重新分配性能

时间:2018-09-27 11:45:58

标签: java spring-data-jpa spring-repositories

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

只有一个List引用,我为其分配findAll的结果,然后为List的项目运行一个循环。

DB中的总记录通常是10K的几倍,即循环当前在6到12次之间进行迭代。

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

如果我将List.addAll()用于findAll个项目,而不是分配引用,并且在添加下一个项目块之前,我使用List.clear()清除列表,则迭代的执行时间保持不变,并且不会t依次增加。

代码的迭代时间增加,

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()

1 个答案:

答案 0 :(得分:-1)

第一种方法是在每个循环中丢弃分配的支持数组,这将浪费大量时间到GC和重新分配空间。

但是,第二个方法可重复使用支持数组,并减少了GC和重新分配时间。

引用:Why ArrayList.clear() method doesn't free memory?