2013-11-06 3 views
1

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

Класс «Игра» расширяет «Thread», имея бесконечный цикл в методе run().

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

Теперь, когда игра закончилась, и объект «Игра» больше не нужен - какие шаги я должен предпринять, чтобы убедиться, что объект «Игра» получает сбор мусора?

Моя идея была бы:

В объекте «Сервер»: удалить ссылку на объект игры в вопросе.

В каждом объекте, используемом объектом Game: уберите ссылку (nullify?) На объект Game.

Разбить бесконечный цикл, который запускает метод Run() объекта Game.

Будет ли это достаточно, или есть другие шаги, или некоторые из этих шагов не являются обязательными?

ответ

2

Этого будет достаточно:

В объекте «Сервер»: удалить ссылку на объект игры в вопрос.

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

0

Теперь, когда игра закончилась, и объект «Игра» больше не нужен - какие шаги я должен предпринять, чтобы убедиться, что объект «Игра» получает сбор мусора?

Так что, если ваше приложение действительно не имеет каких-либо ссылок на объекты, о которых идет речь, то сборщик мусора освободит их. Нить Game должна заканчиваться (т. Е. Метод run() должен возвращаться), так что Thread будет использоваться. Тогда любые объекты, которые помогают объекту Game, затем, в свою очередь, уменьшат их опорные счетчики, позволяя им освободиться.

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

Однако, единственный раз, когда вам нужно будет установить значения полей в нуль, вы подозреваете, что сборщик мусора отстает и неспособно пожинать плоды своевременно. Это несколько редка.

+0

Вместо того, чтобы устанавливать объекты в нуль, обычно более целесообразно давать переменным правильную область видимости. – Cruncher

+0

Он, скорее всего, говорит об объектных полях, которые обычно не могут быть уменьшены в области действия меньше, чем объект @Cruncher. – Gray

+0

Я бы сказал, что в любом случае, что вы действительно хотите, чтобы это GC-поля, это примерно то время, когда объект сам по себе, вероятно, больше не существует. Если вы когда-либо устанавливаете его в поле, оно может быть слишком большим. Просто мои 2 цента, я знаю много людей разных взглядов на этом – Cruncher

1

Все, что вам нужно сделать, это удалить ссылку на объект Game в Server. Несмотря на то, что Game имеет ссылки на другие объекты и те объекты на Game (образующие циклы/круговые ссылки), они по-прежнему недоступны из корня GC, и в итоге все равно будет собираться мусор.

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