2014-06-18 16 views
14

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:

  1. 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.
  2. 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).
  3. 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.
  4. VmMap lo strumento non aggiorna la colonna della memoria cercata.
  5. 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:

  1. Java Mission Controller: Non fornisce la pagina Informazioni sulla taglia.

  2. 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 ??

+0

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

risposta

0

Non sono sicuro se questo è quello che stai cercando.
Ma procexp (Process Explorer) potrebbe essere utile. Non è niente di speciale. Solo un amato Task Manager per Windows 7.

Inoltre, con i download successivi di Java JDK c'è qualcosa chiamato Java Mission Control.

Buona fortuna!

+0

Ho provato il JMC. Sfortunatamente, non fornisce informazioni sulla dimensione della pagina utilizzata. –

1

Penso che il metodo di test non sia appropriato. Si utilizzano le grandi pagine di memoria quando si desidera ottimizzare il TLB:

A Translation-Lookaside Buffer (TLB) is a page translation cache that holds the most-recently used virtual-to-physical address translations. TLB is a scarce system resource. A TLB miss can be costly as the processor must then read from the hierarchical page table, which may require multiple memory accesses. By using bigger page size, a single TLB entry can represent larger memory range. There will be less pressure on TLB and memory-intensive applications may have better performance. 

È possibile utilizzare [jvisualvm], al profilo la vostra applicazione. ma nel caso del tuo test crei nuovi oggetti. Non sono un esperto qui, ma per la comprensione mz di TBL, dovresti caricare i dati dalla memoria alla struttura che dovrebbe essere nel buffer. Se non ci sono dovrebbe essere caricato.

In teoria un test che misura il tempo per un numero costante di operazioni dovrebbe essere sufficiente per vedere l'influenza del parametro VM.

+0

La misurazione del guadagno in termini di prestazioni dell'utilizzo di pagine di memoria di grandi dimensioni (LMP) è il mio obiettivo finale. Attualmente, sto cercando di assicurarmi che li usi effettivamente. Idealmente, quando viene utilizzato LMP, tutto l'oggetto creato deve essere conservato in una memoria non heap e deve essere impedito lo scambio. Una volta che sono sicuro di usare LMP, il test che hai suggerito è il modo giusto per misurare il guadagno in termini di prestazioni. –

0

LMP sembra essere una caratteristica di una particolare allocazione piuttosto che una caratteristica dell'intero processo (http://msdn.microsoft.com/en-us/library/windows/desktop/aa366720(v=vs.85).aspx). Tracciare quale allocazione utilizzata e che non ha utilizzato LMP potrebbe non essere fattibile.

Aggiornamento: provare ad allegare un monitoraggio delle chiamate di sistema al processo. Potresti essere in grado di vedere se VirtualAlloc viene chiamato con parametri corretti.

+0

Il processo JVM è speciale. "una JVM non può mescolare pagine grandi e pagine piccole, anche se si fornisce l'opzione" pagina grande "appropriata" ([Source] (http://developer.amd.com/resources/java-zone/java-zone- Archivio/supersizing-java-grandi-pagine-on-the-Opteron processor-parte-2 /)). Potresti elaborare ulteriori informazioni su come collegare i monitor delle chiamate di sistema? –

+0

Sospetto che JVM utilizzi pagine grandi per il suo heap. Su Linux userei strace. Un monitor di chiamata di sistema noto su Windows è procmon, ma registra solo file, registro e thread/processo, non memoria.Un'altra scelta sembra essere Windows Performance Recorder, ma non l'ho mai usata personalmente. Sono sicuro che esistono più strumenti. – Arkadiy

Problemi correlati