- Узнать размер Java Heap Memory Size
- Обзор памяти Java
- ТЕСТЫ или ГОТОВЫЕ примеры
- Предлагаемые для Java Memory
- Вывод
- Get Physical Memory or RAM Information in Java using OSHI library
- Add OSHI library to the Java project
- How to use OSHI to get Physical Memory Information
- Example 1 Get Information of the Computer Memory
- Example 2 Get Details Information of the Computer Memory
- Example 3 Get List of Physical Memory Device of the Computer
- Example 4 Get Details of Physical Memory Bank of the Computer
Узнать размер 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». Надеюсь, было познавательно.
Get Physical Memory or RAM Information in Java using OSHI library
In this tutorial, we are going to explore how to use the OSHI library to get information about the physical memory (RAM) information of the computer in a Java application. By using the API provided by OSHI Java library we will write programs to show memory of the computer and information of all physical devices located on the computer.
Add OSHI library to the Java project
To use OSHI Java library in the Gradle build project, add the following dependency into the build.gradle file.
compile group: 'com.github.oshi', name: 'oshi-core', version: '5.3.4'
To use OSHI Java library in the Maven build project, add the following dependency into the pom.xml file.
com.github.oshi oshi-core 5.3.4
For more information about the OSHI library you can visit the library repository at github.com/oshi/oshi
How to use OSHI to get Physical Memory Information
To use the OSHI library ro get hardware information of the computer we need to instantiate an object of SystemInfo class.
SystemInfo systemInfo = new SystemInfo();
And call method getHardware() to get HardwareAbstractionLayer that can be used to access hardware information.
HardwareAbstractionLayer hardware = systemInfo.getHardware();
Then we use the getMemory() method to receive the object of GlobalMemory class which can be used to get physical memory information.
GlobalMemory globalMemory = hardware.getMemory();
Example 1 Get Information of the Computer Memory
In the following example Java application we use GlobalMemory class to show summary information of physical memory of the computer where the application is running on.
import oshi.SystemInfo; import oshi.hardware.GlobalMemory; import oshi.hardware.HardwareAbstractionLayer; public class GetRAMInfo1 public static void main(String. args) SystemInfo systemInfo = new SystemInfo(); HardwareAbstractionLayer hardware = systemInfo.getHardware(); GlobalMemory globalMemory = hardware.getMemory(); System.out.println(globalMemory.toString()); > >
Example 2 Get Details Information of the Computer Memory
The following Java example we access details of physical memory information. We also calculate to get used memory by subtracting the total and available memory of the computer.
The return values from OSHI library in bytes value so we can convert it to readable String by using static method FormatUtil.formatBytes().
import oshi.SystemInfo; import oshi.hardware.GlobalMemory; import oshi.hardware.HardwareAbstractionLayer; import oshi.util.FormatUtil; public class GetRAMInfo2 public static void main(String. args) SystemInfo systemInfo = new SystemInfo(); HardwareAbstractionLayer hardware = systemInfo.getHardware(); GlobalMemory globalMemory = hardware.getMemory(); long usedMemory = globalMemory.getTotal() - globalMemory.getAvailable(); System.out.println("Total memory: " + FormatUtil.formatBytes(globalMemory.getTotal())); System.out.println("Available memory: " + FormatUtil.formatBytes(globalMemory.getAvailable())); System.out.println("Used memory: " + FormatUtil.formatBytes(usedMemory)); > >
Total memory: 15.8 GiB Available memory: 6.7 GiB Used memory: 9.2 GiB
Example 3 Get List of Physical Memory Device of the Computer
The following Java example to show how to list all physical memory devices located on the computer.
import oshi.SystemInfo; import oshi.hardware.GlobalMemory; import oshi.hardware.HardwareAbstractionLayer; import oshi.hardware.PhysicalMemory; import java.util.List; public class GetRAMInfo3 public static void main(String. args) SystemInfo systemInfo = new SystemInfo(); HardwareAbstractionLayer hardware = systemInfo.getHardware(); GlobalMemory globalMemory = hardware.getMemory(); ListPhysicalMemory> physicalMemories = globalMemory.getPhysicalMemory(); for (PhysicalMemory physicalMemory : physicalMemories) System.out.println(physicalMemory.toString()); > > >
Bank label: BANK 2, Capacity: 16 GiB, Clock speed: 2.7 GHz, Manufacturer: Samsung, Memory type: DDR4
Example 4 Get Details of Physical Memory Bank of the Computer
In the below Java example we are going to access the details of memory devices. The FormatUtil.formatHertz() static method in the example can be used to show value in hertz to a more readable String.
import oshi.SystemInfo; import oshi.hardware.GlobalMemory; import oshi.hardware.HardwareAbstractionLayer; import oshi.hardware.PhysicalMemory; import oshi.util.FormatUtil; import java.util.List; public class GetRAMInfo4 public static void main(String. args) SystemInfo systemInfo = new SystemInfo(); HardwareAbstractionLayer hardware = systemInfo.getHardware(); GlobalMemory globalMemory = hardware.getMemory(); ListPhysicalMemory> physicalMemories = globalMemory.getPhysicalMemory(); for (PhysicalMemory physicalMemory : physicalMemories) System.out.println("Manufacturer: " + physicalMemory.getManufacturer()); System.out.println("Memory type: " + physicalMemory.getMemoryType()); System.out.println("Bank/slot label: " + physicalMemory.getBankLabel()); System.out.println("Capacity: " + FormatUtil.formatBytes(physicalMemory.getCapacity())); System.out.println("Clock speed: " + FormatUtil.formatHertz(physicalMemory.getClockSpeed())); > > >
Manufacturer: Samsung Memory type: DDR4 Bank/slot label: BANK 2 Capacity: 16 GiB Clock speed: 2.7 GHz