Как изменить размер Heap (кучи) для JVM-приложения?

«Как изменить размер Heap (кучи) для JVM-приложения?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Размер кучи (Heap) задаётся при запуске JVM с помощью специальных параметров и не может быть изменён программно во время выполнения приложения.

Ключевые параметры командной строки:

Параметр Описание Пример
-Xms Начальный (минимальный) размер кучи. -Xms256m (256 МБ)
-Xmx Максимальный размер кучи. -Xmx2g (2 ГБ)

Пример запуска приложения с настройкой кучи:

java -Xms512m -Xmx4g -jar my-application.jar

Практические рекомендации и детали:

  1. Единицы измерения: Используйте m для мегабайт, g для гигабайт (например, -Xmx2048m или -Xmx2g).
  2. Равенство -Xms и -Xmx: Установка одинаковых значений (-Xms4g -Xmx4g) рекомендуется для production, чтобы:
    • Избежать накладных расходов на динамическое расширение кучи.
    • Исключить паузы GC, связанные с увеличением размера.
    • Гарантировать, что приложение сразу получит все необходимые ресурсы.
  3. Ограничения: Максимальный размер кучи ограничен архитектурой ОС (например, 32-битные системы) и доступной физической памятью.
  4. Другие области памяти: Параметры -Xss (размер стека потока) и -XX:MaxMetaspaceSize (метапространство) управляют другими областями памяти JVM.

Проверка текущих настроек из кода (только для чтения):

Runtime runtime = Runtime.getRuntime();
long maxMemory = runtime.maxMemory(); // -Xmx
long totalMemory = runtime.totalMemory(); // Текущий размер кучи (>= -Xms)
long freeMemory = runtime.freeMemory();