Узнайте размер памяти кучи 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
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 uintx MaxHeapSize := 1038090240 uintx PermSize = 21757952 uintx MaxPermSize = 174063616 intx ThreadStackSize = 1024 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 uintx MaxHeapSize := 331350016 uintx PermSize = 21757952 uintx MaxPermSize = 85983232 intx ThreadStackSize = 1024 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 uintx MaxHeapSize := 4267704320 uintx PermSize = 21757952 uintx MaxPermSize = 85983232 intx ThreadStackSize = 0 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 uintx MaxHeapSize := 1073741824 uintx PermSize := 67108864 uintx MaxPermSize := 134217728 intx ThreadStackSize := 512
6. FAQs
Q. What is -version?
A. Избегайте жалоб со стороны компилятора Java, замените «-version» на имя вашего приложения Java.
$ java -XX:+PrintFlagsFinal | grep HeapSize
Q. What is -XX:+PrintCommandLineFlags?
A. Этот -XX:+PrintCommandLineFlags используется для распечатки значений, которые были изменены только VM (обозначены этим символом := ).
7. Заключение
Наконец, значения по умолчанию для памяти кучи, perm gem и размера стека отличаются для каждой JVM, не ожидайте, что JVM назначит оптимальные значения для вашего приложения Java. Лучшая практика — это выяснить детали вашей памяти, а затем соответствующим образом настроить значения.
Просто некоторые узнайте и поделитесь, дайте мне знать ваш комментарий.
Рекомендации
- Технический документ Oracle Memory Management
- Oracle представляет постоянное поколение
- Ergonomics in the 5.0 Java[tm Виртуальная машина]
- Структура памяти JVM
- Heroku: проблемы с памятью Java
- StackOverflow: что такое PermSize в Java?
- StackOverflow: java.lang.OutOfMemoryError: пространство PermGen
- Объяснение java.lang.OutOfMemoryError: пространство PermGen
- JBoss OutOfMemoryExceptions
- Параметры виртуальной машины Java HotSpot
- -XX: + PrintFlagsFinal
- Полезные флаги JVM — часть 3 (печать всех флагов XX и их значений)
- Проверка параметров JVM HotSpot
- OpenJDK — исходный код глобалов
Узнать размер Java Heap Memory Size
Есть проблема с Java Heap Memory Size, ее нужно нормально указать для того чтобы все нормально работало ( например, веб- сервер tomcat, liferay, OpenMRS и так далее) и в данной статье «Узнать размер Java Heap Memory Size» расскажу как можно найти оптимальное значение для java.
Сейчас я покажу вам, как использовать-XX:+PrintFlagsFinal чтобы узнать ваш размер кучи «heap size». В Java, по умолчанию и максимальный размер кучи распределяются на основании алгоритма — эргономики (ergonomics algorithm).
Как же рассчитывается Heap sizes?
Начальный размер кучи — это соотношение 1/64 физической памяти к 1 Гб. (Initial heap size of 1/64 of physical memory up to 1Gbyte)
Максимальный размер кучи — это соотношение 1/4 физической памяти до 1 Гб. (Maximum heap size of 1/4 of physical memory up to 1Gbyte)
Тем не менее, алгоритм что выше, как раз для справки, могут варьироваться в разных VM.
Обзор памяти Java
Краткий обзор структуры памяти Java:
1. Java Heap Size
Место для хранения объектов, созданных приложением Java, это где Garbage Collection берет память для приложений Java. Для «тяжелого процесса Java», недостаточный размер кучи вызовет популярную ошибку: java.lang.OutOfMemoryError: Java heap space.
-Xms — Установить начальный размер Java куча «Java heap size»
-Xmx — Установить максимальный размер Java куча «Java heap size»
$ java -Xms512m -Xmx1024m JavaApp
2. Размер Perm Gen (Perm Gen Size).
Место для хранения определение загруженного класса и метаданных. Если большой кодовый, базовый проект загружен, имеет недостаточный размер Perm Gen size то это вызовит ошибку: Java.Lang.OutOfMemoryError: PermGen.
-XX:PermSize — Установить начальный размер для параметра «PermGen Size».
-XX:MaxPermSize — Установить максимальный размер для параметра «PermGen Size».
$ java -XX:PermSize=64m -XX:MaxPermSize=128m JavaApp
3. Размер java стека «Java Stack Size»
Размер java нитей (Size of a Java thread). Если проект имеет много обработки нитей, попробуйте уменьшить этот размер стека, чтобы избежать нехватки памяти.
-Xss = Установить размер стека Java (java thread stack size).
ЗАМЕТКА
Значение по умолчанию для heap size, perm gen, или stack size отличаются от различных JVM. Лучшие практически всегда определить собственные значение для сервера.
ТЕСТЫ или ГОТОВЫЕ примеры
Приведу различные тесты на разных ОС.
Среда тестирования имеет такие характеристики:
ОС : Ubuntu 13 (64 битная) (Под управлением VirtualBox)
RAM : 4Гб оперативной памяти
CPU : 1 x Процессор
JDK : 1.7
Выполним команду для отображения необходимой информации:
$ java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Для JVM выделено следующие значения по умолчанию:
Java heap size
InitialHeapSize = 64781184 байт (61.7 Мб) и MaxHeapSize = 1038090240 байт (990Мб).
PermGen Size
PermSize = 21757952 байт (20.75 Мб), MaxPermSize = 174063616 байт (166 Мб)
Thread Stack Size
ThreadStackSize = 1024 кб (1 Мб)
Выделенный размер кучи (heap memory size) довольно близок к результатам эргономики.
#ergonomics algorithm
Initial heap size = 4096M/64 = 64 Мб
Maximum heap size = 4096M/4 = 1024 Мб
Среда тестирования имеет такие характеристики:
ОС : Mac OSX 10.9
RAM : 8 Гб оперативной памяти
CPU : 4 x Поцессор
JDK : 1.7
Запускаем команду чтобы проверить:
$ java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'
Узнать размер Java Heap Memory Size в macOS X
Для JVM выделено следующие значения по умолчанию:
Java heap size
InitialHeapSize = 20655360 байт (19.69M) и MaxHeapSize = 331350016 bytes (316 Мб).
PermGen Size
PermSize = 21757952 байт (20.75 Мб), MaxPermSize = 85983232 байт (82 Мб).
Java Stack Size
ThreadStackSize = 1024 Кб (1 Мб)
Выделенный размер кучи памяти (heap memory size) не имеют никакого значения, если сравнить со следующий результат по алгоритму эргономики.
#ergonomics algorithm
Initial heap size = 8192M/64 = 128 Мб
Maximum heap size = 8192M/4 = 2048 Мб
Windows
Grep нет в Windows, вместо этого, мы используем Findstr.
Среда тестирования имеет такие характеристики:
ОС : Windows 8
RAM : 16 Гб
CPU : 8 x процессор
JDK : 1.7
C:\>java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
Узнать размер Java Heap Memory Size в windows
Для JVM в Windows ОС выделено следующие значения по умолчанию:
Java heap size
InitialHeapSize = 266634176 байт (256 Мб) и MaxHeapSize = 4266146816 байт (4068 Мб).
PermGen Size
PermSize = 21757952 байт (20.75 Мб), MaxPermSize = 85983232 bytes (823 Мб).
Java Stack Size
ThreadStackSize = 0 kilobytes. (weird…)
Выделенный размер кучи памяти почти такой же как и по алгоритму эргономика:
#ergonomics algorithm
Initial heap size = 16384/64 = 256 Мб
Maximum heap size = 16384/4 = 4096 Мб
Предлагаемые для Java Memory
Ниже, я привел мою рекомендацию (параметры) для малой и средней нагрузки приложений Java 🙂
Heap = -Xms512m -Xmx1024m
PermGen = -XX:PermSize=64m -XX:MaxPermSize=128m
Thread = -Xss512k
P.S: Для большинства проектов Java, 512k памяти для потока (thread) более чем достаточно.
$ java -XX:+PrintFlagsFinal -Xms512m -Xmx1024m -Xss512k -XX:PermSize=64m -XX:MaxPermSize=128m -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
оптимаьные значения для Java Heap Memory Size
Часто задаваемые вопросы.
какая -version?
Избегайте жалоб от компилятора Java, заменить «-version» с вашим именем приложения Java.
$ java -XX:+PrintFlagsFinal | grep HeapSize
Что это -XX:+PrintCommandLineFlags?
Это -XX:+PrintCommandLineFlags используется для вывода значения,только для изменения VM (обозначается так: = символ).
Вывод
Наконец, значения по умолчанию для heap memory, perm gem и stack size отличается от JVM, не ожидайте что JVM будет использовать оптимальные значения для вашего приложения Java.
На этом, я завершаю «Узнать размер Java Heap Memory Size». Надеюсь, было познавательно.