Срабатывает ли сборщик мусора Java для предотвращения перестановки памяти?

В качестве примера скажем, что я установил максимальную кучу JVM на 4 ГБ. Тем не менее, как только мое приложение достигает около 3 ГБ, ОС начинает переставлять часть памяти на диск. На данный момент уже несколько объектов находятся вне области видимости, и вместо того, чтобы запрашивать больше памяти, JVM может сначала собрать мусор старыми объектами. С точки зрения производительности было бы лучше запустить сборщик мусора, чем выполнять обмен памяти. максимальная куча до 4Гб. Тем не менее, как только мое приложение достигает около 3 ГБ, ОС начинает переставлять часть памяти на диск. На данный момент есть несколько объектов ...

В качестве примера скажем, что я установил максимальную кучу JVM на 4 ГБ. Тем не менее, как только мое приложение достигает около 3 ГБ, ОС начинает переставлять часть памяти на диск. На данный момент уже несколько объектов находятся вне области видимости, и вместо того, чтобы запрашивать больше памяти, JVM может сначала собрать мусор старыми объектами. С точки зрения производительности было бы лучше запустить сборщик мусора, чем выполнять обмен памяти. максимальная куча до 4Гб. Тем не менее, как только мое приложение достигает около 3 ГБ, ОС начинает переставлять часть памяти на диск. На данный момент есть несколько объектов ...

В качестве примера скажем, что я установил максимальную кучу JVM на 4 ГБ. Тем не менее, как только мое приложение достигает около 3 ГБ, ОС начинает переставлять часть памяти на диск. На данный момент уже несколько объектов находятся вне области видимости, и вместо того, чтобы запрашивать больше памяти, JVM может сначала собрать мусор старыми объектами. С точки зрения производительности было бы лучше запустить сборщик мусора, чем выполнять обмен памяти. ОС начинает подменять память на диск. На данный момент уже несколько объектов находятся вне области видимости, и вместо того, чтобы запрашивать больше памяти, JVM может сначала собрать мусор старыми объектами. С точки зрения производительности было бы лучше запустить сборщик мусора, чем выполнять обмен памяти. ОС начинает подменять память на диск. На данный момент уже несколько объектов находятся вне области видимости, и вместо того, чтобы запрашивать больше памяти, JVM может сначала собрать мусор старыми объектами. С точки зрения производительности было бы лучше запустить сборщик мусора, чем выполнять обмен памяти. Умна ли сборка мусора в JVM в подобных ситуациях или совершенно не знает об этом? Можем ли мы как-то настроить JVM для решения этой ситуации?

Я знаю, что есть шанс, что сборка мусора запустится до того, как мы достигнем 3 ГБ, и поэтому нам фактически не нужно менять память, но это не отвечает на мой вопрос.

РЕДАКТИРОВАТЬ: предположим, что на моей машине больше 4 ГБ памяти, но иногда есть другие приложения, которые занимают часть этой памяти, оставляя мне менее 4 ГБ. Я бы предпочел не уменьшать максимальный размер кучи, учитывая, что в большинстве случаев у меня будет 4 ГБ, но мне было интересно, будет ли GC достаточно умным в других ситуациях.

11
задан Mario Duarte 23 August 2010 в 11:48
поделиться

3 ответа

JVM совершенно не осведомлена о лежащем в основе управлении памятью ОС. Я помню, как недавно посетил сеанс JavaOne по оптимизации сборщика мусора, и докладчик подчеркнул, что вы всегда должны следить за тем, чтобы для работы JVM всегда было достаточно свободной памяти (ОЗУ, а не подкачки), чтобы избежать разбиения на страницы любой ценой, поэтому никогда назначьте JVM больше памяти, чем доступно в данный момент в вашей системе. Более того, из-за того, как работают некоторые алгоритмы сбора сборщика мусора, это может иметь огромное снижение производительности, если блоки памяти, которые они собирают, будут выгружены.

Поэтому никогда не выделяйте JVM больше памяти, чем физически доступно в вашей системе, или если вы ожидаете, что потребление памяти со временем увеличится из-за некоторых внешних процессов, тогда назначьте пространство кучи, которое гарантирует, что оно никогда не будет выгружено. И если вы не можете удовлетворить эти условия, тогда вам нужно больше ОЗУ :)

Обновление: немного поискал в SO, и я нашел это . Здесь kdgregory утверждает, что разбиение на страницы не должно быть проблемой из-за того, как работает сборщик мусора, но он рассматривает разбиение на страницы из-за нормальных условий, т.е. память, и вы обязательно начнете листать. Кроме того, если вы используете Linux, проверьте ответ Джона Ферминеллы и его отличное сообщение в блоге , объясняющее, как понимать и настраивать свопинг в Linux.

8
ответ дан 3 December 2019 в 09:18
поделиться

[...] структура памяти областей данных времени выполнения, используемый алгоритм сборки мусора и любая внутренняя оптимизация инструкций виртуальной машины Java (например, их перевод в машинный код) оставлены на усмотрение разработчика. (Спецификация виртуальной машины Java, глава 3)

Не существует такой вещи, как сборщик мусора Java . Спецификация виртуальной машины java сообщает, что каждая реализация jvm должна предоставлять gc, но как это сделать, остается на усмотрение разработчика.

Технически это было бы, по крайней мере, проблемой. Поскольку мы не хотели бы запускать gc на том факте, что некоторые страницы были переставлены в виртуальную память, но мы хотели бы запускать gc, когда управление памятью собирается переставить jvm-страницы на виртуальная память. И я сомневаюсь, что такая информация / уведомление доступна в компьютерной системе.

«ОС на JVM: Эй, лучше почисти сейчас, прежде чем я перекину часть вашей кучи на виртуальную память» - «От JVM к ОС: хорошо, пожалуйста, не меняйте местами, начинаю очистку сейчас, скажу вам, когда закончите» - 1457 мс спустя - «JVM to OS: спасибо за терпение, вычистили насколько это возможно, вы можете продолжить замену сейчас )

2
ответ дан 3 December 2019 в 09:18
поделиться

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

На самом деле не думаю, что даже в C есть простой способ проверить, происходит ли подкачка процесса (может быть, есть, если да, пожалуйста, добавьте комментарий).

2
ответ дан 3 December 2019 в 09:18
поделиться
Другие вопросы по тегам:

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