有时我们发现在for循环中声明了一个引用类型变量 -
for(int i=0; i<1000; i++){
User aUser = new User(id);
//some other code
}
我的问题是 -
1。在for循环中声明引用类型变量的性能是否有任何降低?
2. :内存一次包含1000个用户对象吗?
提前致谢。
答案 0 :(得分:2)
ThreadLocalHeap避免获取对象分配的堆锁。它不分配大对象。它可以在Java堆上分配大小超过512字节的对象,这些对象涉及堆锁。如果用户对象为&lt; 512字节然后性能降低的可能性较小,但无论如何所有1000个对象都将出现在Java堆中。
答案 1 :(得分:1)
声明引用类型的性能是否有任何降低? for循环中的变量?
在这种情况下,您将创建指向新对象的新引用。即使你将引用User aUser
移出循环,它也会导致创建1000个对象,但不会一次又一次地创建引用变量。 IMO你可以移动参考变量,但它可能不会导致大的性能变化。但什么时候使用取决于什么。 IMO如果引用变量不在循环中,它将最终指向循环中最后创建的Object,但如果它在内部,那么它们指向的所有引用和对象都将为垃圾收集做好准备。
内存一次包含1000个用户对象吗?
是的,它可能直到它们全部被垃圾收集而且它何时运行我们永远无法预测。
答案 2 :(得分:1)
如果为每次迭代分配一个新引用,可能会有轻微的性能损失。声明用户aUser也同样容易;在进入循环之前。但是,我怀疑性能损失是否会非常明显,如果有的话。
变量aUser使用的内存应在每次迭代后回收。这可能不会立即发生(Java不能保证何时会发生垃圾收集)
答案 3 :(得分:1)
在for循环中声明引用类型变量的性能是否有任何降低?
每当新对象分配JVM获取堆锁进行分配时。是的,可能会有轻微的表现 由于获得锁定和释放的重复过程导致的退化。
内存一次包含1000个用户对象吗?
是Java堆将包含1000个用户对象。如果这些对象没有任何强大的传出/传入引用,GC将清除这些对象。