Рубрики
Без рубрики

Память пространства Java Heap с API Runtime

Узнайте, как получить доступ к информации о памяти СПМ с помощью API Java Runtime.

Автор оригинала: baeldung.

1. Обзор

В этой статье мы обсудим API, предоставляемые Java, которые могут помочь нам понять несколько аспектов, связанных с пространством Кучи Java.

Это может быть полезно для понимания текущего состояния памяти СПМ и аутсорсинга его для мониторинга услуг, таких как Статистика и Датадог которые затем могут быть настроены для принятия упреждающих мер и избежать сбоев приложения.

2. Доступ к параметрам памяти

Каждое java-приложение имеет один экземпляр java.lang.Runtime которые могут помочь нам понять текущее состояние памяти приложения. Время выполнения-getRuntime статический метод может быть вызван, чтобы получить однотонный Время пример.

2.1. Полная память

Время выполнения-getTotalMemory метод возвращает общее пространство кучи, зарезервированное в настоящее время JVM в байтах. Она включает в себя память, зарезервированную для текущих и будущих объектов. Таким образом, он не гарантируется быть постоянным во время выполнения программы, так как пространство кучи Java может быть расширено или уменьшено по мере выделения большего количество объектов.

Кроме того, это значение не обязательно то, что используется или максимальная память доступна.

2.2. Свободная память

Время выполнения и бесплатное метод возвращает свободное пространство кучи, доступное для выделения новых объектов в байтах. Это может увеличиться в результате операции по сбору мусора, где больше свободной памяти доступна после.

2.3. Максимальная память

Время выполнения:maxMemory метод возвращает максимальную память, которую попытается использовать JVM. Как только использование памяти JVM достигнет этого значения, то он не будет выделять больше памяти и вместо этого, и он будет собирать мусор чаще.

Если объектам JVM все еще нужно больше памяти даже после запуска сборщика мусора, то JVM может java.lang.OutOfMemoryErro r исключение времени выполнения.

3. Пример

В приведеном ниже примере мы от инициализируем ArrayList и добавить элементы к нему, отслеживая пространство кучи JVM с помощью вышеуказанных трех методов:

ArrayList arrayList = new ArrayList<>();
System.out.println("i \t Free Memory \t Total Memory \t Max Memory");
for (int i = 0; i < 1000000; i++) {
    arrayList.add(i);
    System.out.println(i + " \t " + Runtime.getRuntime().freeMemory() + 
      " \t \t " + Runtime.getRuntime().totalMemory() + 
      " \t \t " + Runtime.getRuntime().maxMemory());
}

// ...
Output:
i 	   Free Memory 	   Total Memory 	 Max Memory
0 	     254741016 	 	 257425408 	 	 3817865216
1 	     254741016 	 	 257425408 	 	 3817865216
...
1498 	 254741016 	 	 257425408 	 	 3817865216
1499 	 253398840 	 	 257425408 	 	 3817865216
1500 	 253398840 	 	 257425408 	 	 3817865216
...
900079 	 179608120 	 	 260046848 	 	 3817865216
900080 	 302140152 	 	 324534272 	 	 3817865216
900081 	 302140152 	 	 324534272 	 	 3817865216
...
  • Строка 1498: Время выполнения и бесплатное значение уменьшается, когда достаточное количество объектов выделено место в Java-куче.
  • Строка 900080: На данный момент, JVM имеет больше места, как GC работает, следовательно, значения Время выполнения и бесплатное и Время выполнения и полное память увеличивать.

Значения, показанные выше, как ожидается, будут отличаться на каждом запуске java-приложения.

4. Настройка параметров памяти

Мы можем переопределить значения по умолчанию для параметров памяти JVM, установив пользовательские значения для определенных флагов при запуске нашей программы Java для достижения требуемой производительности памяти:

  • -Xms: Значение, присвоенное -Xms флаг устанавливает начальное и минимальное значение кучи Java. Он может быть использован в тех случаях, когда наше приложение требует больше памяти, чем минимум по умолчанию при запуске JVM
  • -Xmx: Аналогичным образом, мы можем установить максимальное значение для пространства кучи, назначив его -Xmx флаг. Он может быть использован, когда мы хотим ограничить объем памяти, что наше приложение будет использовать, нарочно.

Обратите внимание также, что -Xms значение должно быть равным или меньшим, чем -Xmx ценность.

4.1. Использование

java -Xms32M -Xmx64M Main                                                                                        
Free Memory   : 31792664 bytes
Total Memory  : 32505856 bytes
Max Memory    : 59768832 bytes

java -Xms64M -Xmx64M Main
Free Memory   : 63480640 bytes
Total Memory  : 64487424 bytes
Max Memory    : 64487424 bytes

java -Xms64M -Xmx32M Main                                                                                        
Error occurred during initialization of VM
Initial heap size set to a larger value than the maximum heap size

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

В этой статье мы видели, как получить метрики памяти JVM с помощью Время класс. Эти методы могут быть полезны при Утечки памяти JVM и другие проблемы, связанные с производительностью памяти JVM.

Мы также показали, как назначать пользовательские значения для определенных флагов, ведущих к различным поведением памяти JVM для различных сценариев.