Я пытаюсь измерить прирост производительности при использовании больших страниц памяти в Windows 7 HotSpot JVM. Для этого мне необходимо отслеживать использование памяти JVM, чтобы убедиться, что большие страницы действительно используются. К сожалению, я не могу найти этого. Ниже приведено описание установок и испытаний, которые я сделал:
Настройка среды
Я использую 64-разрядную версию Windows 7 для своих тестов. "Блокировать страницы в памяти" Политика безопасности Windows включена, как описано в Поддержка Java для больших страниц памяти. Я также подтвердил, что функция "Большие страницы" включена, выполнив команду java version следующим образом:
java -XX:+UseLargePages -version
Где я получаю следующие результаты, которые посвящают функцию больших страниц:
java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)
Я использовал эту примерную программу Java из это видео во всех моих тестах, чтобы использовать всю память, доступную для кучи java:
public class InfinteStringHashmap {
public static void main(String[] args) throws Exception{
Map<Long, String> map = new HashMap<Long, String>();
for(long i=1; true; i++){
StringBuilder sb = new StringBuilder();
for(long j=0;j<i;j++) sb.append(" ");
map.put(i, sb.toString());
if(i % 1000 == 0){
System.out.print(".");
Thread.sleep(1000);
}
}
}
}
Я запустил эту программу с помощью следующей команды (с фиксированным размером кучи размером 512 м):
java -Xms512m -Xmx512m -XX:+UseLargePages InfinteStringHashmap
Я также пробовал другие размеры кучи размером до 12 МБ и размером до 10 ГБ. Обратите внимание, что я запускаю свое тестовое приложение сразу после перезагрузки компьютера, чтобы убедиться, что моя свободная оперативная память не фрагментирована.
Сбой при проверке памяти
Чтобы проверить, используются ли большие страницы памяти или нет, я попытался:
- инструмент RamMap из Windows SystInternals, который имеет специальное поле для больших страниц. Независимо от того, как я изменяю размер кучи, он не показывает использование страниц с большой памятью. Чтобы проверить это, я попробовал Создание сопоставления файлов с использованием больших страниц из MSDN, чтобы сузить возможности. Он работал отлично (он печатает размер страницы размером 2 МБ от вложенного кода). Инструмент RamMap ничего не показывает.
- Печать размера страницы, используемого процессом Java, с использованием кода, предложенного в этом сообщении. Он печатает 4096 (размер страницы по умолчанию в Windows) все время. Чтобы проверить это, я попробовал "Большие страницы" в версии Linux JVM Hotspot, как описано в это видео, и это сработало. Однако печать размера страницы не помогла (она печатает 4096 все время).
- Vadump инструмент, который показывает статистику виртуальной памяти о конкретном процессе. Опция "-o" должна показывать типы виртуальной машины, используемые процессом, количество используемых страниц и общий размер занятых каждым типом, который может использоваться для определения того, используются ли большие страницы. К сожалению, эта команда не работает с кодом ошибки 24, когда я устанавливаю параметр JVM UseLargePages.
- Инструмент VmMap не обновляет отображаемый столбец памяти.
- Простые средства мониторинга, такие как TaskManager и Perfmon, не предоставляют подробную информацию о больших страницах.
Изменить. Я пробовал следующие инструменты, которые были предложены в комментариях:
-
Контроллер миссий Java: не предоставляет информацию о размере страницы.
-
Проводник процессов: тот же, что и выше
Есть ли возможность измерить размер страницы процесса или контролировать использование больших страниц памяти в Windows?