Sto provando a misurare il guadagno di prestazioni dell'utilizzo di pagine di memoria di grandi dimensioni in Windows 7 HotSpot JVM. Per fare ciò, ho bisogno di monitorare l'utilizzo della memoria JVM per assicurarmi che le Pagine Grandi siano effettivamente utilizzate. Sfortunatamente, non riesco a trovare la via per raggiungere questo obiettivo. Segue una descrizione della messa a punto e le prove che ho fatto:Come monitorare l'utilizzo della JVM di grandi pagine di memoria in Windows 7?
Configurazione ambiente
sto utilizzando a 64 bit di Windows 7 edizione definitiva per i miei test. "Blocca pagine in memoria" Il criterio di sicurezza di Windows è abilitato come descritto in Java Support for Large Memory Pages. Ho anche verificato che le pagine grandi funzione è attivata per l'esecuzione dei comandi versione Java come il seguente:
java -XX:+UseLargePages -version
Dove ottengo i seguenti risultati, che dedicano che le grandi pagine caratteristica è attivata:
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)
ho usato questo programma di esempio Java da this video in tutte le mie prove di consumare tutta la memoria disponibile per l'heap 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);
}
}
}
}
ho eseguito questo campione prog RAM utilizzando il seguente comando (con una dimensione mucchio fissa di 512 per esempio):
java -Xms512m -Xmx512m -XX:+UseLargePages InfinteStringHashmap
Ho provato anche altre dimensioni mucchio piccolo come 12 MB e grandi quanto 10GB. Nota che eseguo la mia applicazione di test subito dopo il riavvio della macchina per assicurarmi che la mia memoria RAM libera non sia frammentata.
prove non sono riusciti a monitorare la memoria
Al fine di verificare se grandi pagine di memoria vengono utilizzati o meno, ho provato:
- RamMap tool da di Windows SystInternals che ha un campo specifico per le pagine di grandi dimensioni . Indipendentemente da come modifico la dimensione dell'heap, non viene mostrato l'utilizzo di pagine di memoria di grandi dimensioni. Per verificarlo, ho provato l'esempio Creating a File Mapping Using Large Pages dal MSDN per restringere le possibilità. Ha funzionato perfettamente bene (stampa una dimensione della pagina di 2 MB da insed the code). Lo strumento RamMap non mostra nulla.
- Stampa delle dimensioni della pagina utilizzate dal processo Java utilizzando il codice suggerito in this post. Stampa 4096 (la dimensione della pagina predefinita su Windows) per tutto il tempo. Per verificarlo, ho provato Large Pages sulla versione Linux di Hotspot JVM come descritto in this video e ha funzionato. Tuttavia, la stampa delle dimensioni della pagina non ha funzionato (stampa sempre 4096 volte).
- Vadump strumento che mostra le statistiche della memoria virtuale relative a un processo specifico. L'opzione "-o" dovrebbe mostrare i tipi di VM utilizzati da un processo, il numero di pagine utilizzate e la dimensione totale di occupato da ciascun tipo che può essere utilizzata per dedurre se vengono utilizzate pagine di grandi dimensioni. Sfortunatamente, questo comando fallisce con il codice di errore 24 quando imposto l'opzione UseLargePages di JVM.
- VmMap lo strumento non aggiorna la colonna della memoria cercata.
- Strumenti di monitoraggio semplici come TaskManager e Perfmon non forniscono informazioni dettagliate sulle pagine grandi.
Edit: ho provato i seguenti strumenti che sono stati suggeriti nei commenti:
Java Mission Controller: Non fornisce la pagina Informazioni sulla taglia.
Process Explorer: come sopra
C'è via per misurare le dimensioni della pagina di un processo o di monitorare l'uso di grandi pagine di memoria in Windows ??
Anche io sono interessato a questo. -server -XX: + UseLargePages -XX: + PrintFinalFlags mostra che UseLargePages: = false (perché?) e il fatto che tutta la memoria dell'heap è solo all'interno del working set privato conferma che questo è il caso. La possibilità di bloccare le pagine in memoria è abilitata per l'utente in esecuzione JVM, fino a 12 GB di RAM liberi subito dopo il riavvio. – afk5min