Может ли максимальный размер кучи JVM быть динамическим? - PullRequest
23 голосов
/ 13 августа 2010

Аргумент JVM -Xmx позволяет установить максимальный размер кучи для JVM на некоторое значение.Но есть ли способ сделать это значение динамичным?Другими словами, я хочу сказать JVM: «Послушайте, если вам это нужно, просто продолжайте извлекать ОЗУ из системы до тех пор, пока система не выйдет».

Причина, состоящая из двух частей: во-первых, приложение вВопрос может использовать очень широкий диапазон оперативной памяти в зависимости от того, что делает пользователь, поэтому концептуальные минимальные и максимальные значения довольно далеко друг от друга.Во-вторых, может показаться, что JVM резервирует максимальное пространство кучи из виртуальной памяти во время загрузки.Это конкретное приложение работает на довольно большом разнообразии аппаратного обеспечения, поэтому выбрать максимальный объем кучи «один размер подходит всем» сложно, так как оно должно быть достаточно низким, чтобы работать на слабом оборудовании, но мы действительнохотел бы иметь возможность использовать действительно мощные машины, если они доступны.

Ответы [ 3 ]

11 голосов
/ 13 августа 2010

Но есть ли способ сделать это значение динамическим?

Буквально нет. Максимальный размер кучи устанавливается во время запуска JVM и не может быть увеличен.

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

EDIT

Стоит отметить, что существуют различные варианты настройки -XX... GC, которые позволяют настроить способ, которым JVM расширяет кучу (до максимума).

Другая возможность - разделить ваше приложение на 2 части. Первая часть заявки делает всю подготовку, необходимую для определения «размера» проблемы. Затем он определяет соответствующий максимальный размер кучи и запускает вторую виртуальную часть приложения, требующую памяти, в новой JVM.

  • Это работает, только если приложение может быть разумно разделено, как указано выше.

  • Это работает, только если возможно вычислить размер проблемы. В некоторых случаях вычисление размера проблемы равносильно вычислению результата.

  • Не ясно, что вы получите более высокую общую производительность, чем если бы вы просто позволили куче вырасти до максимального размера.

7 голосов
/ 13 августа 2010

Это не так. Может, и, вероятно, должно:

-Xmx90%  // 90% of physical memory

Однако неявное значение по умолчанию, 100%, вероятно, не очень хорошая идея.

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

Язык GC другой. Он собирает мусор только при необходимости. Пока есть место, его не волнует мусор. Если бы он мог получить всю память, которую хотел бы иметь, он получил бы всю память компьютера.

Таким образом, программисту GC больше не нужно беспокоиться об утилизации каждого куска мусора, но он все равно должен иметь общее представление о допустимом соотношении мусора / живых объектов и инструктировать GC с -Xmx.

3 голосов
/ 13 августа 2010

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

Я делаю это только в OS X и Linux: у меня есть небольшой bash сценарий оболочки, который заботится о поиске правильных параметров JVM в зависимости от оборудования, на котором выполняется приложение, а затем вызывает JVM.

Обратите внимание, что если вы предоставляете настольное Java-приложение, вы можете использовать что-то вроде izpack, чтобы предоставить своим пользователям установщик:

http://izpack.org

Я вообще не знаю, можно ли использовать Java Web Start для предоставления различных параметров JVM, в зависимости от конфигурации пользователя (возможно, нет, и JWS действительно все равно получит большое удовольствие, если вы планируете предоставить профессионально выглядящее настольное приложение) ).

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