Как правильно выделить огромное пространство кучи для JVM

Я пытаюсь обойти проблему, которая беспокоила меня некоторое время. В двух словах: на каком основании следует назначать максимальное пространство кучи для ресурсоемкого приложения и есть ли недостаток в том, что оно слишком велико?

У меня есть приложение, используемое для визуализации огромных медицинских данных, которые могут потреблять до нескольких гигабайт памяти, если несколько томов изображений открыты по размеру рядом. Кэширование данных для просмотра необходимо для плавного рабочего процесса. Программное обеспечение поддерживается рабочими станциями Windows и запускается с помощью загрузчика, который назначает размер кучи и запускает основное приложение. Фактическая память, необходимая основному приложению, прямо пропорциональна просматриваемым данным и не может быть определена загрузчиком, поскольку для этого потребовалось бы чтение данных, что, в конечном счете, заняло бы слишком много времени.

Таким образом, чтобы убедиться, что JVM имеет достаточно памяти во время запуска, мы устанавливаем xmx настолько большим, насколько это возможно, исходя из текущего дизайна, исходя из максимальной физической памяти рабочей станции. Однако есть ли в этом недостаток? Я читал (из сообщения от 2008 года), что собственные процессы могут занимать лишнее пространство кучи, что может привести к ошибкам памяти во время выполнения. Должен ли я также нюхать свободную виртуальную память или размер файла подкачки перед выделением места в куче? Как бы вы справились с этой ситуацией?

О, и это мой первый пост на этих форумах. Приятно познакомиться и быть нежным! :)

Обновление:

Спасибо за ответы на все вопросы. Я не уверен, правильно ли я выразил свои слова, но моя проблема возникла из-за того, что я ничего не знаю об оборудовании, на котором будет работать это программное обеспечение, но, тем не менее, хотел бы выделить как можно больше места в куче для программного обеспечения. .

Я пришел к решению выделить кучу из 70% физической памяти, ЕСЛИ доступно достаточное количество виртуальной памяти - в противном случае меньше.


person pnkkr    schedule 09.09.2016    source источник
comment
Лучше кэшировать данные в разных осколках Redis и развертывать приложения на разных jvm. Огромная куча не рекомендуется.   -  person neohope    schedule 09.09.2016
comment
Несколько связано: stackoverflow.com/questions/39462735/   -  person WW.    schedule 13.09.2016


Ответы (2)


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

Возможны размеры кучи в 100 ГБ, но у них есть недостатки, в основном из-за того, что они могут иметь большое время паузы. Если вы используете Azul Zing, он может гораздо изящнее обрабатывать гораздо большие размеры кучи.

Основным ограничением является размер вашей памяти. Если ваша куча превышает это значение, ваше приложение и ваш компьютер будут работать очень медленно/будут непригодны для использования.

Стандартный способ обойти эти проблемы с картографическим программным обеспечением (которое, например, должно уметь отображать на карту весь мир) — это разбить ваши изображения на плитки. Таким образом, вы отображаете только изображение, которое является одним из экранов (или части, которые находятся на экране). Если вам нужно иметь возможность увеличивать и уменьшать масштаб, вам может потребоваться хранить данные на двух-четырех уровнях масштаба. Используя этот подход, вы можете просматривать карту всего мира на своем телефоне.

person Peter Lawrey    schedule 09.09.2016

Лучше не устанавливать максимальную память JVM больше 60-70% памяти рабочей станции, а в некоторых случаях даже меньше, по двум основным причинам. Во-первых, то, что JVM потребляет на физической машине, может быть на 20% или более больше, чем куча, из-за механики GC. Во-вторых, представление определенного объекта данных в куче JVM может быть не единственной физической копией этого объекта в оперативной памяти машины, поскольку ОС имеет кэши, буферы и т. д. вокруг различных устройств ввода-вывода, с которых она захватывает эти объекты.

person Jonah Benton    schedule 11.09.2016