Уточнение Java сборщик мусора - PullRequest
0 голосов
/ 16 сентября 2010

Сейчас я читаю эту статью о сборке мусора Java: http://www.javaworld.com/javaworld/jw-08-1996/jw-08-gc.html?

Вот фрагмент функции в клиенте JMS

public void foo(){
    ...//Create Connection factory, connection, and session, topic

    TopicSubscriber tp = session.createDurableSubcriber(topic,"001");
    tp.setMessageListener(this)
}

Этот вопрос не о JMS, а о том, что происходит с объектом "tp" после завершения вызова функции foo (). После завершения функции больше нельзя ссылаться на tp. Я предполагаю, что в createDurableSubscriber () используется ключевое слово «new», которое означает, что объект помещается в кучу JVM. Однако, так как на tp больше нельзя ссылаться, он подвергается сборке мусора JVM?

Ответы [ 5 ]

2 голосов
/ 16 сентября 2010

Вам нужно заглянуть в исходный код для session.createDurableSubcriber(), чтобы узнать, не хранит ли оно значение, которое вам где-то вернется.

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

1 голос
/ 16 сентября 2010

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

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

1 голос
/ 16 сентября 2010

На него можно ссылаться в вашем сеансе как на поле или передавать куда-либо еще, в зависимости от реализации JMS. JMS - это всего лишь API, вы просто не можете предположить что-либо о реализации, и вы не можете предположить, что на tp больше нет ссылок.

Но чтобы ответить на вопрос, если вы все равно «предполагаете», что на него нет ссылок, да, GC позаботится об этом.

1 голос
/ 16 сентября 2010

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

В вашем примере, если вы предполагаете, что create... фактически создает новый объект, и по какой-то причине не сохраняет ссылку на него, и что для присоединения слушателя к указанному объекту не требуется создавать ссылку на наблюдаемое, тогда да - tp, вероятно, будет иметь право на доработку и сбор.

Если какое-либо из этих предположений неверно, все ставки отменены.

1 голос
/ 16 сентября 2010

Возможно.На него все еще можно ссылаться через некоторую цепочку указателей, начинающуюся где-то со статической переменной.

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