Как я могу прочитать счетчик производительности «Виртуальные байты» Windows на Java для процесса Java? - PullRequest
1 голос
/ 22 февраля 2012

Возможно, с использованием jniwrap.jar и winpack.jar , поэтому мне не нужно накатывать свой собственный код JNI, как я могу прочитать счетчик производительности "Виртуальные байты" для службы Java?Служба будет считывать собственный счетчик производительности, чтобы периодически регистрировать, сколько виртуального адресного пространства используется.В настоящее время он регистрирует значение JMX «CommittedVirtualMemorySize», возвращаемое ОС JMX MBean, но это показывает только объем памяти, зафиксированный , поэтому на самом деле не помогает понять, собираетесь ли вы исчерпать свой ресурс.виртуальное адресное пространство.

Это для серверного процесса на основе Java, где иногда поток компилятора Java исчерпывает кучу C, что приводит к сбою всей JVM в процессе.Мой собственный код не виновник - это сама JVM.Но эти диагностические данные помогут мне понять потребности службы в полном виртуальном адресном пространстве.

Редактировать: С момента постановки этого вопроса я пробовал несколько разных вещей, но пока безрезультатно.Оказывается, winpack.jar разрешает доступ к реестру, и есть ключ реестра RegistryKey.PERFORMANCE_DATA, который предположительно обеспечивает доступ к данным о производительности через доступ, подобный реестру, но у меня всегда не было ключей назад.Я нашел пример кода в VB, который использовал этот метод для получения данных о производительности, и даже с этим кодом я не получил никаких данных.Это на рабочем столе Win7Pro.Разве эти данные недоступны по умолчанию?

Если я не могу заставить этот метод работать, то я думаю, что единственный другой выбор - это попытка использовать jniwrap или winpack, чтобы каким-то образом выполнить код на Java, эквивалентный этому коду C #:

PerformanceCounter PC = new PerformanceCounter();
PC.CategoryName = "Process";
PC.CounterName = "Virtual Bytes";
PC.InstanceName = "Java#1";
PC.ReadOnly = true;
float VirtualBytes = PC.NextValue();

но я не могу придумать хороший способ сделать это.Кто-нибудь знаком с Jniwrapper / winpack или с получением данных о производительности через реестр, кто может предложить способ сделать это?

Я признаю, что всегда есть возможность написать внешнюю программу C # или сценарий WMI, чтобы получить этоинформации, но я ожидаю, что это будет на несколько порядков медленнее (и больше работы для реализации), чем получение прямого программного доступа к этой информации.

1 Ответ

0 голосов
/ 24 апреля 2012

Оказывается, что библиотека WinPack.jar предоставляет эту информацию!Я не нашел никаких документов, которые помогли бы мне найти это.Просто просматривая документацию по API и экспериментируя, я смог придумать этот код.Замените MemoryStatus на MemoryInfo, если вы используете последнюю версию библиотеки:

import com.jniwrapper.win32.system.MemoryStatus;

...

private void test() {
  MemoryStatus mStatus = new MemoryStatus();
  System.out.println("TotalVirtual: " + getBytesInMB(mStatus.getTotalVirtual()) + " MB");
  System.out.println("AvailVirtual: " + getBytesInMB(mStatus.getAvailVirtual()) + " MB");
  System.out.println("UsedVirtual:  " + getBytesInMB(mStatus.getTotalVirtual() - mStatus.getAvailVirtual()) + " MB");
}

private long getBytesInMB(final long input) {
  return input / 1024 / 1024;
}

, это дает мне то, что я ищу - использование виртуального адресного пространства процесса Java, которыйзапустить этот код.Это не универсальное решение, но оно может помочь другим людям, которые хотят регистрировать такую ​​же информацию.

...