Удаление объекта из кучи немедленно - PullRequest
0 голосов
/ 28 ноября 2018

Я в настоящее время кодирую сервер, который использует netty, и мне приходит много пакетов. Если я прочитал пакет, я хочу немедленно удалить его из ОЗУ.Это означает, что я не хочу полагаться на GC, но немедленно освобождаю оперативную память.Так как GC запускается только раз в 5-50 секунд, но мой код работает намного быстрее и будет поддерживать низкий объем ОЗУ.

Можно ли вызвать метод, чтобы сказать Java, что этот объект больше не нужен и должен быть удален сейчас?

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Это означает, что я не хочу полагаться на GC, но немедленно освобождаю оперативную память.

К сожалению, вы используете не тот язык, если хотите это сделать.Java не позволяет отключать ГХ и управлять памятью вручную.

0 голосов
/ 29 ноября 2018

Вопрос, который вам нужно задать себе, - почему вы хотите немедленно удалить объект пакета?Вы говорите, что GC запускается каждые 5-50 секунд, и вы хотите поддерживать низкий уровень оперативной памяти (я полагаю, вы имеете в виду использование).

При написании кода Java вы не должны (действительно) учитывать его взаимодействие с управлением памятью JVM,При запуске приложения будет установлен размер кучи (либо с использованием значений по умолчанию, либо явно через ключи командной строки -Xms / -Xmx).Если приложение обрабатывает все доставляемые пакеты и допустимы издержки GC (время паузы приложения), тогда ваш код работает именно так, как должен.У вас нет причин хотеть удалять обработанные пакеты, поскольку GC делает это для вас.

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

Вы должны позволить JVM выполнять свою работу и сосредоточиться на логике приложения.

0 голосов
/ 28 ноября 2018

Вы не можете сразу удалить отдельные объекты из кучи в Java.

Вы можете (попытаться) заставить сборку мусора 1 , вызвав System.gc(), но это плохо для производительности .

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

Если вам действительно нужен этот уровеньконтроля, вам лучше использовать язык, который не требует сборщика мусора.Попробуйте C или C ++.Или Rust.


1 - существует опция JVM (-XX:DisableExplicitGC), которая определяет, действительно ли вызов System.gc() вызывает сборку мусора.Обратитесь к java ручному вводу для получения подробной информации об этом и связанных параметрах.

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