Java 循环内部的变量声明

Java 循环内部的变量声明,java,performance,for-loop,Java,Performance,For Loop,有时,我们发现在for循环中声明了一个引用类型变量,如下所示- for(int i=0; i<1000; i++){ User aUser = new User(id); //some other code } for(int i=0;i 声明引用类型是否会降低性能 for循环中的变量 在这种情况下,您将创建指向新对象的新引用。即使您将引用User aUser移出循环,它也将导致创建1000个对象,但不会一次又一次地创建引用变量。在我看来,您可以将引用变量移出,但可

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

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

   User aUser = new User(id);

   //some other code 
}  
for(int i=0;i
声明引用类型是否会降低性能
for循环中的变量

在这种情况下,您将创建指向新对象的新引用。即使您将引用
User aUser
移出循环,它也将导致创建1000个对象,但不会一次又一次地创建引用变量。在我看来,您可以将引用变量移出,但可能不会导致大的性能变化h、 但何时使用取决于。IMO如果引用变量在循环外,它将指向循环中最后创建的对象,但如果它在循环内,那么它们指向的所有引用和对象都将准备好进行垃圾收集

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

是的,它可能会一直运行,直到它们都被GC垃圾收集,它何时运行我们永远无法预测

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

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

  • 在for循环中声明引用类型变量是否会降低性能

    每当分配给新对象的JVM获得堆来进行分配时。是的,可能会有轻微的性能 由于获取锁定和释放的重复过程而导致降级

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

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


  • ThreadLocalHeap避免为对象分配获取heaplock。它不分配大对象。它可以在java堆上分配大小超过JVM do分配的512字节的对象,这涉及堆锁。如果用户对象小于512字节,则性能降低的可能性较小,但无论如何,所有1000个对象都将java堆中的ent