Наборы Java и сборщик "мусора"

Немного вопроса относительно производительности в веб-приложении Java.

Давайте предположим, что у меня есть a List<Rubrique> listRubriques с десять Rubrique объекты.

A Rubrique содержит один список продуктов (List<product> listProducts) и один список клиентов (List<Client> listClients).

Что точно происходит в памяти, если я делаю это:

listRubriques.clear(); listRubriques = null;

Моя точка зрения была бы этим с тех пор listRubriques пусто, все мои объекты, на которые ранее ссылается этот список (включая listProducts и listClients) будет собран "мусор" довольно скоро. Но начиная с Набора в Java немного хитры и так как у меня есть вполне проблемы производительности с моим приложением, которое я задаю вопросу :)

редактирование: давайте примем теперь, когда мой Объект клиента содержит a List<Client>. Поэтому у меня есть своего рода циклическая ссылка между моими объектами. Что произошло бы затем если мой listRubrique установлен на null? На этот раз моя точка зрения была бы то, что мои Объекты клиента станут "недостижимыми" и могли бы создать утечку памяти?

13
задан Joachim Sauer 8 March 2010 в 15:04
поделиться

3 ответа

Фактическое внедрение солнца для Java копии время от времени все ссылочные / живые объекты. Космос, от которого был скопирован, можно использовать снова для распределения памяти.

Это сказал, что ваши примеры повреждают фактически производительность. ListRubriques.Clear () ненужден (за исключением того, что вы когда-то удерживаете ссылку на него), потому что все, на которые ссылается ListRubrique, является мусором, моментом ListRubriques больше не ссылается. ListRubriques = NULL также может быть ненужден, если переменные ListRubriques выйдут из неисправности после этого (возможно, потому что это локальная переменная, а метод заканчивается здесь).

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

Эта статья - это хорошая ссылка на получение большего количества информации о сборщике мусора Java.

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

15
ответ дан 1 December 2019 в 22:57
поделиться

Если у вас есть:

listRubriques = null;

и нет других объектов, удерживающих ссылок на ListRubriques или его содержащие объекты, это , имеющих право для сборки мусора. Но нет никакой гарантии, когда JVM фактически запустит сборку мусора на ней и свободной памяти. Вы можете позвонить:

System.gc();

Рекомендовать JVM, что вы думаете, что работает сборка мусора в это время - хорошая идея. Но даже тогда нет гарантии.

Также имеется

listRubriques.clear();

перед установкой ListRubriques на NULL не нужно.

Редактировать : Чтобы ответить на ваш вопрос о круговых ссылках, JVMS достаточно умны, чтобы выяснить, что весь график объекта отключен от любого активного кода, и JVM правильно определит, что они имеют право на сбор мусора. Это всегда было правдой даже в старых временах ссылки. Современные JVMS просто быстрее и эффективнее. Но они не собирают мусор большего количества предметов, чем пожилые JVMS.

4
ответ дан 1 December 2019 в 22:57
поделиться

Это зависит от случая, но важно заметить, что в первом случае ThrowFooBarException () вызывается нервно, если ThrowIOException () создает исключение, и во втором случае ThrowFooBarException будет всегда вызываться , если исключение не будет повторно создано в первом улове

-121--3866418-

Я только что нашел ответ.

  1. Необходимо зарегистрировать XULRunner на компьютере. Для этого просто распакуйте его и выполните эту команду в командной оболочке xulrunner.exe --register-global .
  2. Передайте стиль SWT.MOZILLA конструктору браузера: Браузер = новый браузер (оболочка, SWT.MOZILLA);
-121--4780296-

«Довольно скоро» - довольно расплывчатая спецификация, но сборщик мусора, вероятно, не такой быстрый, как вы ожидаете Когда объекты действительно будут собраны, многое зависит от конфигурации GC и загрузки сервера, но это может занять некоторое время, и если у вашей виртуальной машины достаточно кучи и другие вещи для этого, объекты не будут собраны «довольно скоро».

Единственная ситуация, когда спецификация ВМ гарантирует, что GC будет запущен, это когда в какой-то момент в противном случае будет вызвана ошибка OutOfMemureError. Перед отправкой OutOfMemureError виртуальная машина обязана предпринять попытку собрать, по крайней мере, столько подходящих экземпляров объектов, чтобы соответствующий запрос на выделение памяти мог быть успешным (но вам все еще не гарантировано, что будут собраны все подходящие экземпляры).

1
ответ дан 1 December 2019 в 22:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: