2015-05-10 2 views
2

Иногда мы обнаружили переменную ссылочного типа, объявленную внутри для цикла, как это -Объявление переменной внутри цикла для

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

    User aUser = new User(id); 

    //some other code 
} 

Мой вопрос есть -
1. Есть ли снижение производительности для объявления ссылки введите переменную внутри цикла for?

2. Сохраняет ли память 1000 объектов пользователя за раз?

Заранее благодарен.

ответ

1

Есть ли снижение производительности для объявления ссылочного типа переменной внутри цикла for?

В этом случае вы создадите новую ссылку, чтобы указать на новый объект. Даже если вы перемещаете ссылку User aUser из цикла, тогда это приведет к созданию 1000 объектов, но ссылочная переменная не будет создана снова и снова. IMO вы можете перемещать ссылочную переменную, но она не может вызвать большие изменения производительности как таковые. Но когда использовать то, что зависит. IMO, если ссылочная переменная находится вне цикла, она будет указывать на последний созданный объект в цикле, но если он внутри, все ссылки и объекты, на которые они указывают, будут готовы для сбора мусора.

Сохраняет ли в памяти 1000 объектов пользователя за раз?

Да, это может быть до тех пор, пока все они не будут собраны GC, и когда это произойдет, мы никогда не сможем предсказать.

1
  1. При назначении новой ссылки для каждой итерации может произойти небольшое повышение производительности. Было бы так же легко объявить User aUser; перед входом в цикл. Однако я сомневаюсь, что потеря производительности будет очень заметной, если вообще.

  2. Память, используемая переменной aUser, должна быть переработана после каждой итерации. Это не может произойти мгновенно (Java не гарантирует, когда сборка мусора будет происходить)

1
  1. Есть ли снижение производительности для объявления переменной ссылочного типа внутри для цикла?

    Всякий раз, когда новый объект выделяется, JVM приобретает кучу для выполнения распределения. Да, может быть небольшая производительность деградация из-за многократного процесса блокировки и освобождения.

  2. Имеет ли память 1000 объектов пользователя за раз?

    Да Java-куча будет содержать 1000 пользовательских объектов. GC очистит эти объекты, если у него нет сильной исходящей/входящей ссылки на этот объект.

2

ThreadLocalHeap избегает приобретения кучи для размещения объектов. Он не выделяет большие объекты. Он может выделять объекты размером 512 байт за пределы того, что JVM делает выделение на куче java, которая включает блокировку кучи.Если объект User из < 512 байтов, то в снижении производительности меньше возможностей, но все равно 1000 объектов будут присутствовать в куче java.

+0

Дать ссылки на ThreadLocalHeap –