защо да анулираме променливите на екземпляра, когато унищожаваме EJB със състояние?

В пример за анотация @remove на EJB с поддържащо състояние, анотираният метод анулира променливите на екземпляра на компонента. Защо? Със сигурност унищожаването на зърна унищожава съдържанието му, т.е. всички променливи?

Благодаря, Джон


person Jon    schedule 06.05.2012    source източник


Отговори (3)


Задаването на всички полета на обект на null има два полезни ефекта:

  • Той осигурява твърда бариера срещу логически грешки, които биха довели до повторно използване на невалиден обект. Приложението ще се срине, вместо безшумно да дава неправилни резултати.

  • Той помага на Java VM събирача на отпадъци, като премахва ръбовете от референтната графика на обекта, като по този начин подобрява цялостната производителност.

person thkala    schedule 06.05.2012
comment
Задаването на препратки към членове на null е малко вероятно да помогнете на събирача на боклука. - person McDowell; 07.05.2012
comment
@McDowell: Това ще зависи от как полетата са зададени на null. Ако това е просто присвояване в хода на нормална работа, това е добре и полезно, поне според моя профильор. Ако това изисква възпроизвеждане на работата на GC чрез изрично ходене по сложни структури, тогава това е много лоша идея. Като цяло, човек трябва да профилира програмата си, преди да предприеме такива микрооптимизации... - person thkala; 07.05.2012

Можете ли да публикувате примерния изходен код? Или недей. Проактивната настройка на null не е необходима - когато EJB бъде унищожен и боклукът се събира скоро по-късно, всички обекти, към които той препраща (разбира се, при условие че няма други препратки към тях), също ще бъдат събирани.

person Tomasz Nurkiewicz    schedule 06.05.2012

Ако ejbRemove(), атрибутите на екземпляра се изтриват и клиентът все още има препратка към екземпляра. Клиентът все още има достъп до същия обект. Това не е желателно.

person Neelesh Shukla    schedule 16.07.2014