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

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

java-heap-size

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

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

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

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

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

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

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

$ java -Xms512m -Xmx1024m JavaApp

2. Perm Gen Size
Место для хранения определения загруженного класса и метаданных. Если загружен большой проект, основанный на коде, недостаточный размер Perm Gen вызовет популярныйJava.Lang.OutOfMemoryError: PermGen.

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

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

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

$ java -Xss512k JavaApp

Note
Значение по умолчанию для размера кучи, разрешения или размера стека отличается от разных JVM. Лучшая практика - всегда определять собственную ценность.

2. Ubuntu

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

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 heap size
    InitialHeapSize = 64781184 байта (61,7M) и MaxHeapSize = 1038090240 байт (990M).

  2. PermGen Size
    PermSize = 21757952 байта (20,75 МБ), MaxPermSize = 174063616 байтов (166 МБ)

  3. Thread Stack Size
    ThreadStackSize = 1024 килобайт (1M)

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

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

3. Mac OS X

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

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 heap size
    InitialHeapSize = 20655360 байт (19,69M) и MaxHeapSize = 331350016 байт (316M).

  2. PermGen Size
    PermSize = 21757952 байта (20,75 МБ), MaxPermSize = 85983232 байта (82 МБ).

  3. Java Stack Size
    ThreadStackSize = 1024 килобайт (1M)

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

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

4. Windows

В 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 heap size
    InitialHeapSize = 266634176 байт (256M) и MaxHeapSize = 4266146816 байт (4068M).

  2. PermGen Size
    PermSize = 21757952 байта (20,75 МБ), MaxPermSize = 85983232 байта (823. M).

  3. Java Stack Size
    ThreadStackSize = 0 килобайт. (странно…)

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

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

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

Ниже представлено мое рекомендуемое значение для небольшого и среднего Java-приложения :)

  1. Куча = -Xms512m -Xmx1024m

  2. PermGen = -XX: PermSize = 64m -XX: MaxPermSize = 128m

  3. Резьба = -Xss512k

P.S For most Java projects, 512k for a thread is sufficient.

$ 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. FAQs

Q. What is -version?
A. Избегайте жалоб со стороны компилятора Java, замените «-version» на имя вашего приложения Java.

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

Q. What is -XX:+PrintCommandLineFlags?
A. Этот-XX:+PrintCommandLineFlags используется для распечатки значений, которые были изменены только VM (обозначены этим символом:=).

7. Заключение

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

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