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 с помощью вышеуказанных трех методов:
ArrayListarrayList = 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 для различных сценариев.