Узнайте размер вашей памяти кучи Java
В этой статье мы покажем вам, как использовать-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 выделяла следующие значения по умолчанию:
-
Java heap size
InitialHeapSize = 64781184 байта (61,7M) и MaxHeapSize = 1038090240 байт (990M). -
PermGen Size
PermSize = 21757952 байта (20,75 МБ), MaxPermSize = 174063616 байтов (166 МБ) -
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)
-
Java heap size
InitialHeapSize = 20655360 байт (19,69M) и MaxHeapSize = 331350016 байт (316M). -
PermGen Size
PermSize = 21757952 байта (20,75 МБ), MaxPermSize = 85983232 байта (82 МБ). -
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)
-
Java heap size
InitialHeapSize = 266634176 байт (256M) и MaxHeapSize = 4266146816 байт (4068M). -
PermGen Size
PermSize = 21757952 байта (20,75 МБ), MaxPermSize = 85983232 байта (823. M). -
Java Stack Size
ThreadStackSize = 0 килобайт. (странно…)
Размер выделенной кучи памяти почти такой же, как и с эргономичным результатом:
#ergonomics algorithm Initial heap size = 16384/64 = 256M Maximum heap size = 16384/4 = 4096M
5. Предлагаемая память Java
Ниже представлено мое рекомендуемое значение для небольшого и среднего Java-приложения :)
-
Куча = -Xms512m -Xmx1024m
-
PermGen = -XX: PermSize = 64m -XX: MaxPermSize = 128m
-
Резьба = -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. Лучшая практика - это выяснить детали вашей памяти, а затем соответствующим образом настроить значения.
Просто некоторые узнайте и поделитесь, дайте мне знать ваш комментарий.