Итак, я пишу свой собственный 3D-движок. Я сохраняю объекты, загруженные из OBJ-файла внутри списка массивов. Проблема в том, что когда я удаляю объект из списка, он не получает сбор мусора. Его все еще можно найти где-то в коде, но это боль в шее, чтобы искать. Поэтому мне было интересно, есть ли способ заблокировать объект, когда я удалю его, чтобы он выдавал ошибку всякий раз, когда что-то пытается получить к ней доступ.
Высокомолекулярная сетка может занимать до нескольких сотен мегабайт в памяти.
Спасибо. (Я не хочу публиковать код, потому что он довольно колоссальный)Как намеренно отказаться от объекта для сбора мусора. (Java)
ответ
Если у вас есть контейнер, добавьте объект, а затем удалите объект, теперь у вас больше нет ссылки на указанный объект.
Если вы ДЕЙСТВИТЕЛЬНО обеспокоены ссылкой, или если вы сделали ее копии, то просто неявно = null
их.
«ошибка», выброшенная, была бы теперь нулевым указателем, если у вас все еще есть ссылка на нее. (но если вы действительно хотите удалить его, вы не должны)
Вы не можете удалить объект из памяти, когда он все еще ссылается.
Самое большее, что вы можете сделать, это удалить или свести к минимуму его внутреннее состояние, если объект структурирован таким образом. Например, вы можете позвонить clear()
в подборках, и это приведет к удалению всех элементов из коллекции, что значительно сократит их количество. В вашем случае, я полагаю, вы могли бы добавить метод «invalidate», который делает что-то подобное (хотя это, вероятно, странный дизайн, было бы предпочтительнее выяснить, где объект все еще используется и почему).
Это может быть разрешено с дополнительным уровнем разыменования. Вместо того, чтобы хранить ваши BigObject
в коллекции, хранить «конверт» для объекта, и добавить release()
операцию уронить только ссылку на реальный объект:
interface MyInterface {
void usefulOperation();
}
class VeryBigObject implements MyInterface {
public void usefulOperation() {
...
}
}
class BigObjectEnvelope implements MyInterface {
private MyInterface inner = new VeryBigObject();
public void usefulOperation() {
inner.usefulOperation();
}
public void release() {
inner = null;
}
}
сделать коллекцию BigObjectEnvelope
объектов и использовать их через их интерфейс MyInterface
. Когда вы закончите с объектом, наберите release()
. Даже если у вас есть другие ссылки на BigObjectEnvelope
в других местах, вызов usefulOperation()
на нем вызовет исключение.
Очень интересная идея. Это похоже на ручную реализацию техники надгробия. Я попробую это –
Объект на самом деле не находится в контейнере. Когда он создан, он хранится внутри ArrayList. Я заметил, что он имеет ссылку на сетку, которая также имеет ссылку на объект. Оно не может быть собрана из опорного контура. –
@JackLe. В любой из современных современных JVM есть сборщик мусора, который может обрабатывать опорные петли. – hexafraction
@JackLe Сбор мусора обрабатывает циклы по определению. Java сделала это с самого начала. – EJP