В этой статье мы покажем вам, как использовать -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 -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 выделила следующие значения по умолчанию:
- Размер кучи Java байт (61,7 М) и байт (990 М).
- Размер PermGen байт (20,75 М), байт (166 М)
- Размер стека потоков килобайт (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)
- Размер кучи Java байт (19,69 М) и байт (316 м).
- Размер PermGen байт (20,75 М), байт (82 М).
- Размер стека 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)
- Размер кучи Java байт (256 м) и байт (4068 м).
- Размер PermGen байт (20,75 М), байт (823.М).
- Размер стека Java килобайт. (странно…)
Выделенный объем памяти кучи почти совпадает с результатом эргономики:
#ergonomics algorithm Initial heap size = 16384/64 = 256M Maximum heap size = 16384/4 = 4096M
5. Предлагаемая Память Java
Ниже приведено мое предлагаемое значение для небольшого и среднего Java-приложения 🙂
- Куча = -Xms512m-Xmx1024m
- ПермГен =
- Поток = -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-приложения. Лучше всего узнать детали вашей памяти, а затем соответствующим образом настроить значения.
Просто некоторые узнают и делятся, дайте мне знать ваш комментарий.
Рекомендации
- Технический документ по управлению памятью Oracle
- Оракул, представляющий Постоянное поколение
- Эргономика в виртуальной машине Java 5.0[tm]
- Структура памяти JVM
- Хероку: Проблемы с памятью Java
- StackOverflow: Что такое “PermSize” в Java?
- Стековый поток: java.язык. Ошибка из памяти: Пространство PermGen
- Объяснение java.lang. Ошибка из памяти: Пространство PermGen
- Исключение JBoss Outofmemoryexception
- Параметры виртуальной машины Java HotSpot
- -XX:+Печать финала
- Полезные флаги JVM – Часть 3 (Печать всех флагов XX и их значений)
- Проверка параметров JVM точки доступа
- OpenJDK – глобальный исходный код
Оригинал: “https://mkyong.com/java/find-out-your-java-heap-memory-size/”