2016-05-08 12 views
1

Итак, я пишу свой собственный 3D-движок. Я сохраняю объекты, загруженные из OBJ-файла внутри списка массивов. Проблема в том, что когда я удаляю объект из списка, он не получает сбор мусора. Его все еще можно найти где-то в коде, но это боль в шее, чтобы искать. Поэтому мне было интересно, есть ли способ заблокировать объект, когда я удалю его, чтобы он выдавал ошибку всякий раз, когда что-то пытается получить к ней доступ.

Высокомолекулярная сетка может занимать до нескольких сотен мегабайт в памяти.

Спасибо. (Я не хочу публиковать код, потому что он довольно колоссальный)Как намеренно отказаться от объекта для сбора мусора. (Java)

ответ

-1

Если у вас есть контейнер, добавьте объект, а затем удалите объект, теперь у вас больше нет ссылки на указанный объект.

Если вы ДЕЙСТВИТЕЛЬНО обеспокоены ссылкой, или если вы сделали ее копии, то просто неявно = null их.

«ошибка», выброшенная, была бы теперь нулевым указателем, если у вас все еще есть ссылка на нее. (но если вы действительно хотите удалить его, вы не должны)

+0

Объект на самом деле не находится в контейнере. Когда он создан, он хранится внутри ArrayList. Я заметил, что он имеет ссылку на сетку, которая также имеет ссылку на объект. Оно не может быть собрана из опорного контура. –

+0

@JackLe. В любой из современных современных JVM есть сборщик мусора, который может обрабатывать опорные петли. – hexafraction

+0

@JackLe Сбор мусора обрабатывает циклы по определению. Java сделала это с самого начала. – EJP

0

Вы не можете удалить объект из памяти, когда он все еще ссылается.

Самое большее, что вы можете сделать, это удалить или свести к минимуму его внутреннее состояние, если объект структурирован таким образом. Например, вы можете позвонить clear() в подборках, и это приведет к удалению всех элементов из коллекции, что значительно сократит их количество. В вашем случае, я полагаю, вы могли бы добавить метод «invalidate», который делает что-то подобное (хотя это, вероятно, странный дизайн, было бы предпочтительнее выяснить, где объект все еще используется и почему).

1

Это может быть разрешено с дополнительным уровнем разыменования. Вместо того, чтобы хранить ваши 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() на нем вызовет исключение.

+0

Очень интересная идея. Это похоже на ручную реализацию техники надгробия. Я попробую это –

 Смежные вопросы

  • Нет связанных вопросов^_^