Могут ли объекты уничтожить себя? (Джава) - PullRequest
2 голосов
/ 13 декабря 2011

Мы все знаем, что JRE уничтожит любой объект, на который больше нельзя ссылаться. Но есть ли способ для объекта явно уничтожить себя? Или это запрещено, чтобы избежать проблемы с висящим указателем?

Наивно, я бы хотел сказать this = null, но это запрещено компилятором (this, вероятно, в любом случае не является истинной переменной).

И наоборот, существует ли способ для объекта принудительно поддерживать себя, сохраняя частные копии this или иным образом?

Ответы [ 4 ]

4 голосов
/ 13 декабря 2011

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

Вы можете сохранить объект живым, сохранив статическую ссылку на него.

2 голосов
/ 13 декабря 2011

Игнорируя академический аспект, вы не можете гарантировать, что объект физически уничтожен в Java (или в большинстве других языков для сборки мусора, таких как C #). Это связано с тем, что уничтожение объектов обходится дорого (частично из-за фазы сжатия памяти), поэтому смысл в том, чтобы запускать его как можно меньше раз.

При этом, однако, вы можете заставить объект освободить свои выделенные ресурсы, используя одноразовый шаблон, где рассматриваемый объект предоставляет публичный метод для освобождения ресурсов, и вы можете вызвать его в любое время ( или он вызывается автоматически в финализаторе). Это требует немного больше бухгалтерии, но оно выполняет работу, если это действительно необходимо.

1 голос
/ 13 декабря 2011

Нет, вы не можете уничтожить объект.

То, что вы могли бы сделать, это иметь объект-обертку, который содержит реальный объект. Если вы убедитесь, что ни у кого больше нет ссылки на этот объект, удаление этой ссылки (например, установив ее на нуль) сделает объект пригодным для сборщика мусора. Обратите внимание, что GC по-прежнему должен решать, когда и нужно ли собирать мусор.

Чтобы сохранить объект живым, вам необходимо убедиться, что на него есть ссылка. Одним из способов было бы иметь статическую ссылку из класса объекта. Пока никто не выгружает класс, ваш объект будет оставаться в памяти.

0 голосов
/ 13 декабря 2011

Как вы сказали, я думаю, что запрещено избегать проблем с висящими указателями.Модель памяти Java основана на модели стека и кучи, если объект уничтожает себя сам, что будет идти в стек (или) другие указатели, которые ссылаются на объект?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...