Проверить доступный размер кучи программно? - PullRequest
7 голосов
/ 27 июня 2011

Я использую Eclipse. Проблема в том, что мое приложение вылетает, если выделенная память меньше 512 МБ. Есть ли возможность проверить доступную память для программы перед тем, как приступить к ее исчерпывающей обработке? Например, я знаю, что мы можем проверить доступный размер кучи JVM как:

long heapSize = Runtime.getRuntime().totalMemory();
System.out.println("Heap Size = " + heapSize);

Проблема в том, что это дает размер кучи JVM. Даже увеличение его не работает с использованием Eclipse. В Eclipse, если я изменяю аргументы VM, тогда это работает. Однако распечатка приведенных выше утверждений всегда одинакова. Есть ли какая-нибудь команда, с помощью которой я могу точно знать, сколько памяти выделено для конкретного приложения?

1 Ответ

16 голосов
/ 27 июня 2011

Вы можете использовать JMX для сбора данных об использовании памяти кучи во время выполнения.


Пример кода:

import java.lang.management.ManagementFactory;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryType;
import java.lang.management.MemoryUsage;

for (MemoryPoolMXBean mpBean: ManagementFactory.getMemoryPoolMXBeans()) {
    if (mpBean.getType() == MemoryType.HEAP) {
        System.out.printf(
            "Name: %s: %s\n",
            mpBean.getName(), mpBean.getUsage()
        );
    }
}

Пример вывода:

Name: Eden Space: init = 6619136(6464K) used = 3754304(3666K) committed = 6619136(6464K) max = 186253312(181888K)
Name: Survivor Space: init = 786432(768K) used = 0(0K) committed = 786432(768K) max = 23265280(22720K)
Name: Tenured Gen: init = 16449536(16064K) used = 0(0K) committed = 16449536(16064K) max = 465567744(454656K)

Если у вас есть вопросы по поводу "Eden Space" или "Survivor Space", посмотрите Как разделен пул памяти Java

...