for循环中的变量声明

时间:2015-05-10 02:27:27

标签: java performance for-loop

有时我们发现在for循环中声明了一个引用类型变量 -

for(int i=0; i<1000; i++){

   User aUser = new User(id);

   //some other code 
}  

我的问题是 -
1。在for循环中声明引用类型变量的性能是否有任何降低?

2. :内存一次包含1000个用户对象吗?

提前致谢。

4 个答案:

答案 0 :(得分:2)

ThreadLocalHeap避免获取对象分配的堆锁。它不分配大对象。它可以在Java堆上分配大小超过512字节的对象,这些对象涉及堆锁。如果用户对象为&lt; 512字节然后性能降低的可能性较小,但无论如何所有1000个对象都将出现在Java堆中。

答案 1 :(得分:1)

  

声明引用类型的性能是否有任何降低?   for循环中的变量?

在这种情况下,您将创建指向新对象的新引用。即使你将引用User aUser移出循环,它也会导致创建1000个对象,但不会一次又一次地创建引用变量。 IMO你可以移动参考变量,但它可能不会导致大的性能变化。但什么时候使用取决于什么。 IMO如果引用变量不在循环中,它将最终指向循环中最后创建的Object,但如果它在内部,那么它们指向的所有引用和对象都将为垃圾收集做好准备。

  

内存一次包含1000个用户对象吗?

是的,它可能直到它们全部被垃圾收集而且它何时运行我们永远无法预测。

答案 2 :(得分:1)

  1. 如果为每次迭代分配一个新引用,可能会有轻微的性能损失。声明用户aUser也同样容易;在进入循环之前。但是,我怀疑性能损失是否会非常明显,如果有的话。

  2. 变量aUser使用的内存应在每次迭代后回收。这可能不会立即发生(Java不能保证何时会发生垃圾收集)

答案 3 :(得分:1)

  1. 在for循环中声明引用类型变量的性能是否有任何降低?

    每当新对象分配JVM获取堆锁进行分配时。是的,可能会有轻微的表现 由于获得锁定和释放的重复过程导致的退化。

  2. 内存一次包含1000个用户对象吗?

    是Java堆将包含1000个用户对象。如果这些对象没有任何强大的传出/传入引用,GC将清除这些对象。