Рубрики
Без рубрики

Узнайте размер вашей памяти кучи Java

– Узнайте размер вашей памяти кучи Java

В этой статье мы покажем вам, как использовать -XX:+PrintFlagsFinal , чтобы узнать подробности о размере вашей кучи. В Java размер кучи по умолчанию и максимальный размер кучи выделяются на основе этого – алгоритма эргономики .

Размеры кучи Начальный размер кучи 1/64 физической памяти до 1 Гбайт Максимальный размер кучи 1/4 физической памяти до 1 Гбайт

Однако приведенные выше алгоритмы приведены только для справки, они могут отличаться в разных виртуальных машинах.

1. Обзор памяти Java

Краткий обзор структуры памяти Java:

1. Размер кучи Java Место для хранения объектов, созданных вашим Java-приложением, здесь происходит сборка мусора, память, используемая вашим Java-приложением. Для тяжелого процесса Java недостаточный размер кучи приведет к популярному java.lang. Ошибка из памяти: Пространство кучи Java .

-Xms - Set initial Java heap size
-Xmx - Set maximum Java heap size

$ java -Xms512m -Xmx1024m JavaApp

2. Размер пермского поколения Место для хранения загруженного определения класса и метаданных. Если загружен большой проект с базой кода, недостаточный размер PermGen приведет к популярному Ява. Лэнг. Ошибка памяти: PermGen .

-XX:PermSize - Set initial PermGen Size.
-XX:MaxPermSize - Set the maximum PermGen Size.

$ java -XX:PermSize=64m -XX:MaxPermSize=128m JavaApp

3. Размер стека Java Размер потока Java. Если в проекте обрабатывается много потоков, попробуйте уменьшить размер этого стека, чтобы избежать нехватки памяти. – Xss размер стека потоков java

$ java -Xss512k JavaApp

2. Убунту

Это среда тестирования:

OS  : Ubuntu 13 (64 bits) (Under VirtualBox)
RAM : 4G
CPU : 1 x Processors
JDK : 1.7.0_51
$ java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
            
    uintx InitialHeapSize                          := 64781184        {product}   
    uintx MaxHeapSize                              := 1038090240      {product} 
    uintx PermSize                                  = 21757952        {pd product}
    uintx MaxPermSize                               = 174063616       {pd product}
     intx ThreadStackSize                           = 1024            {pd product}          
java version "1.7.0_51"
OpenJDK Runtime Environment (IcedTea 2.4.4) (7u51-2.4.4-0ubuntu0.13.10.1)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)

В описанной выше среде JVM выделила следующие значения по умолчанию:

  1. Размер кучи Java байт (61,7 М) и байт (990 М).
  2. Размер PermGen байт (20,75 М), байт (166 М)
  3. Размер стека потоков килобайт (1 м)

Выделенный объем памяти кучи довольно близок к результату эргономики.

#ergonomics algorithm 
Initial heap size = 4096M/64 = 64M
Maximum heap size = 4096M/4 = 1024M

3. Mac OSX

Это среда тестирования:

OS  : Mac OSX 10.9
RAM : 8G
CPU : 4 x Processors
JDK : 1.7.0_05
$ java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'
            
    uintx InitialHeapSize                          := 20655360        {product}
    uintx MaxHeapSize                              := 331350016       {product}
    uintx PermSize                                  = 21757952        {pd product}
    uintx MaxPermSize                               = 85983232        {pd product}
     intx ThreadStackSize                           = 1024            {pd product}
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.1-b03, mixed mode)
  1. Размер кучи Java байт (19,69 М) и байт (316 м).
  2. Размер PermGen байт (20,75 М), байт (82 М).
  3. Размер стека Java килобайт (1 м)

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

#ergonomics algorithm 
Initial heap size = 8192M/64 = 128M
Maximum heap size = 8192M/4 = 2048M

4. Окна

В Windows нет grep , вместо этого мы используем findstr .

Это среда тестирования:

OS  : Windows 8
RAM : 16G
CPU : 8 x Processors
JDK : 1.7.0_40
C:\>java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
    
    uintx InitialHeapSize                          := 266634176       {product}
    uintx MaxHeapSize                              := 4267704320      {product}
    uintx PermSize                                  = 21757952        {pd product}
    uintx MaxPermSize                               = 85983232        {pd product}
     intx ThreadStackSize                           = 0               {pd product}
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)
  1. Размер кучи Java байт (256 м) и байт (4068 м).
  2. Размер PermGen байт (20,75 М), байт (823.М).
  3. Размер стека Java килобайт. (странно…)

Выделенный объем памяти кучи почти совпадает с результатом эргономики:

#ergonomics algorithm
Initial heap size = 16384/64 = 256M
Maximum heap size = 16384/4 = 4096M

5. Предлагаемая Память Java

Ниже приведено мое предлагаемое значение для небольшого и среднего Java-приложения 🙂

  1. Куча = -Xms512m-Xmx1024m
  2. ПермГен =
  3. Поток = -Xss512k

P.S Для большинства проектов Java достаточно 512 кб для потока.

$ java -XX:+PrintFlagsFinal -Xms512m -Xmx1024m -Xss512k -XX:PermSize=64m -XX:MaxPermSize=128m
	-version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

    uintx InitialHeapSize                          := 536870912       {product}
    uintx MaxHeapSize                              := 1073741824      {product}
    uintx PermSize                                 := 67108864        {pd product}  
    uintx MaxPermSize                              := 134217728       {pd product}  
     intx ThreadStackSize                          := 512             {pd product}

6. Часто задаваемые вопросы

Q. Что такое – версия? A. Избегайте жалоб от компилятора Java, замените “-версию” именем вашего приложения Java.

$ java -XX:+PrintFlagsFinal {your-java-program} | grep HeapSize

Q. Что такое -XX:+printcommandlineflags? О. Это -XX:+PRINTCOMMANDLINEFLAGS используется для печати значений, измененных только виртуальной машиной (обозначено этим символом := ).

7. Вывод

Наконец, значения по умолчанию для кучи памяти, перманентного драгоценного камня и размера стека отличаются от каждой JVM, не ожидайте, что JVM назначит оптимальные значения для вашего Java-приложения. Лучше всего узнать детали вашей памяти, а затем соответствующим образом настроить значения.

Просто некоторые узнают и делятся, дайте мне знать ваш комментарий.

Рекомендации

  1. Технический документ по управлению памятью Oracle
  2. Оракул, представляющий Постоянное поколение
  3. Эргономика в виртуальной машине Java 5.0[tm]
  4. Структура памяти JVM
  5. Хероку: Проблемы с памятью Java
  6. StackOverflow: Что такое “PermSize” в Java?
  7. Стековый поток: java.язык. Ошибка из памяти: Пространство PermGen
  8. Объяснение java.lang. Ошибка из памяти: Пространство PermGen
  9. Исключение JBoss Outofmemoryexception
  10. Параметры виртуальной машины Java HotSpot
  11. -XX:+Печать финала
  12. Полезные флаги JVM – Часть 3 (Печать всех флагов XX и их значений)
  13. Проверка параметров JVM точки доступа
  14. OpenJDK – глобальный исходный код

Оригинал: “https://mkyong.com/java/find-out-your-java-heap-memory-size/”