Найти размер кучи в JRE

1

У меня есть Linux-система, в которой у меня есть JVM, и она используется тремя процессами java.

/home/codesrc>java -version
          java version "1.7.0_09"
          Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
          Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)

Итак, у меня есть 3 процесса с использованием той же JRE. каждый из этих процессов имеет свою собственную память, определенную в командной строке при установке как

java -Xms256m -Xmx1024m -cp $CLASSPATH <class name>
java -Xms256m -Xmx512m -cp $CLASSPATH <class name>
java -Xms256m -Xmx705m -cp $CLASSPATH <class name>

Память на Linux-системе составляет 4 ГБ. Я пытаюсь найти использование кучи отдельно для каждого из этих процессов. Поскольку у меня нет JDK в системе, я не могу использовать jmap, jconsole или jstack. Я пытался

Runtime.getRuntime().totalMemory()

но это не дает мне основанный на процессе, а также вывод для вышеизложенного не видит права. У любого есть идея о том, как проверить использование кучи, когда только с использованием JRE, что эквивалентно

jmap -heap <PID>
  • 0
    Вы можете использовать visualvm или jconsole, чтобы подключиться к запущенному процессу и увидеть его размер кучи.
  • 0
    Я попытался jmap и jstack, установив JDK, и я получаю следующую ошибку: Прикрепление к идентификатору процесса 10431, пожалуйста, подождите ... Исключение в потоке "main" java.lang.RuntimeException: Тип "nmethodBucket *", на который ссылаются в VMStructs: : localHotSpotVMStructs в удаленной виртуальной машине, отсутствует в удаленной таблице VMStructs :: localHotSpotVMTypes (должен быть обнаружен в отладочной сборке этой виртуальной машины). Не могу продолжить.
Теги:
memory-management
heap

2 ответа

2
Лучший ответ

Вы ищете текущее использование памяти вашего текущего процесса? Вы пробовали следующее?

Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()
  • 0
    да, я сделал, "Runtime.getRuntime (). totalMemory () - Runtime.getRuntime (). freeMemory ()" даст вам использование в целом на уровне JRE, мне нужно на уровне отдельного процесса что-то вроде jmap -heap <pid >
  • 0
    Интересно. Я предполагаю, что у меня сложилось впечатление, что каждый процесс выполняется в своей собственной JVM со своей кучей. Разве это не так?
Показать ещё 1 комментарий
2

Лучше всего включить агент JMX при запуске виртуальной машины Java на вашем сервере и использовать хост с JConsole для подключения.

В качестве альтернативы вы можете использовать локальное приложение, которое использует JMX для извлечения деталей (см. Другой вопрос):

List memBeans = ManagementFactory.getMemoryPoolMXBeans();           
for (Iterator i = memBeans.iterator(); i.hasNext(); ) {

    MemoryPoolMXBean mpool = (MemoryPoolMXBean)i.next();
    MemoryUsage usage = mpool.getUsage();

    String name = mpool.getName();      
    float init = usage.getInit()/1000;
    float used = usage.getUsed()/1000;
    float committed = usage.getCommitted()/1000;
    float max = usage.getMax()/1000;
    float pctUsed = (used / max)*100;
    float pctCommitted = (committed / max)*100;

}
  • 0
    Недостатком этого подхода является то, что агент JMX и коннекторы также потребляют память. Если ваше приложение в настоящее время критично относится к ресурсам памяти, и вы открываете его, вы можете сделать так, чтобы ваше приложение выдало OOM = \

Ещё вопросы

Сообщество Overcoder
Наверх
Меню