Domanda

Sto cercando di misurare l'utilizzo della memoria di un processo, di un programma java) su linux e ho due domande relative a:

  1. Ho provato ad usare lo script ps_mem.py(somma i valori da /proc/$PID/smaps) e il picco di utilizzo della memoria totale è stato di circa 135MB (privato e di una memoria condivisa).La quantità di memoria condivisa è meno di 1MB.Cercando di utilizzare Valgrind con il massiccio strumento valgrind --tool=massif --trace-children=yes --stacks=yes java myProgram rendimenti di circa 10MB al picco di utilizzo della memoria.
    Ora da quanto ho capito, heap è dove le variabili del mio programma sono memorizzati, significa che la differenza tra i due metodi è lo spazio occupato dal codice stesso (tra cui la jvm)?

  2. Fa lo stesso programma di utilizzare diverse quantità di memoria su macchine diverse se hanno diverse quantità di RAM e/o utilizzare diversi processori ARM o x86)?

È stato utile?

Soluzione

  1. Dipende.
    • Molte delle mappature di memoria condivisa in smaps sono direttamente assistiti da biblioteche / binari sul disco. Mentre l'impronta di questi non importa, è meno importante in quanto il sistema può eliminare queste pagine in qualsiasi momento e ricaricarli dal disco in caso di necessità di nuovo.
    • Tutto ciò che è sporco o privata appartiene esclusivamente al processo in corso (beh, albero processo se la forcella di programma senza dirigenti). Questo è più importante perché il sistema deve salvare loro di scambiare se ha bisogno di spingere queste pagine di memoria.
    • Che massiccio di misura è probabilmente correlato con quest'ultimo. Tuttavia, la memoria occupata dalla JVM in sé (senza il vostro programma) è in entrambi.
  2. Sì. Java o una libreria che utilizza potrebbe regolare il suo modello di memoria a seconda delle dimensioni della RAM disponibile. Su una diversa architettura, si utilizza completamente diversi binari, che può essere maggiore o minore o disposti in modo diverso o usando diverse strategie per la gestione JIT e la memoria.

Altri suggerimenti

C'è una domanda simile oltre a questo e a rispondere allo stesso qui per far sapere alle persone come linux proc stat informazioni mv attualmente non è preciso.
Valgrind possibile visualizzare informazioni dettagliate, ma rallenta l'applicazione di destinazione, in modo significativo, e la maggior parte del tempo cambia il comportamento dell'applicazione.

Presumo che tutti vogliono sapere WRT "utilizzo memoria" è la seguente...
In linux, la quantità di memoria fisica di un singolo processo potrebbe utilizzare possono essere approssimativamente suddivise in categorie seguenti.

  • M. un anonimo memoria mappata
    • .p privato
      • .d sporco == malloc/mmapped heap e stack allocato e scritti di memoria
      • .c clean == malloc/mmapped heap e stack di memoria allocata, scritto, poi liberato, ma non ancora recuperato
    • .comune
      • .d sporco == non ci dovrebbe essere nessuno
      • .c clean == non ci dovrebbe essere nessuno
  • M. n denominato memoria mappata
    • .p privato
      • .d sporco == file mmapped scritti di memoria privata
      • .c clean == mappato programma/libreria testo privato mappata
    • .comune
      • .d sporco == file mmapped scritti di memoria condivisa
      • .c clean == mappato in libreria un testo condiviso mappata

Io preferirei avere i numeri come indicato di seguito per ottenere i numeri reali in meno overhead.
Devi sommare questi, al fine di dividere ciò che ps mostra come RSS e più accurata, i numeri non confondere.
/proc/pid ()/lo stato cerca di mostrare questi numeri, ma essi stanno fallendo.
Così, invece di cercare di etichetta [anonimo], [stack], correttamente a ogni mappatura, il mio desiderio è che kernel linux persone mainline il proc codice di somma e vedi questi M. un.p.d, M. un.p.c, M. n.p.d, ....numeri.
Linux Embedded la gente si farà davvero felice IMHO.

M. un.p.d:

 awk '/^[0-9a-f]/{if ($6=="") {anon=1}else{anon=0}} /Private_Dirty/{if(anon) {asum+=$2}else{nasum+=$2}} END{printf "sum=%d\n",asum}' /proc/<pid>/smaps

M. un.p.c:

 awk '/^[0-9a-f]/{if ($6=="") {anon=1}else{anon=0}} /Private_Clean/{if(anon) {asum+=$2}else{nasum+=$2}} END{printf "sum=%d\n",asum}' /proc/<pid>/smaps

M. n.p.d:...e così via

Per 1 #, la memoria condivisa è la memoria (potenzialmente) utilizzato da più di un processo. Questo è fondamentalmente se si esegue lo stesso file binario in più processi o diversi processi stanno utilizzando una libreria condivisa. Il mucchio è dove è memorizzato memoria allocata (quando si utilizza new in Java). Dal momento che Java ha il suo VM, si sta stanziando un sacco di memoria sul livello di processo che non si vede nel codice Java. Penso che sì, la maggior parte di quei 135 MB è dalla JVM codice / dati stessi. Tuttavia, v'è anche la memoria occupata dallo stack (quando effettuare una chiamata di funzione e sono variabili locali) pure.

Per 2 #, diverse quantità di RAM non interesserebbe la quantità di "memoria" è usato quando lasciamo la memoria uguale spazio di swap RAM +. Tuttavia, diversi processori (soprattutto se stiamo parlando di 32 bit vs 64 bit) possono utilizzare diverse quantità di memoria. Inoltre, il modo in cui un processo viene compilato può modificare la quantità di memoria utilizzata, perché è possibile indicare un compilatore di ottimizzare per occupazione di memoria rispetto alla velocità, così come la disattivazione alcune o tutte ottimizzazione del tutto.

Si potrebbe voler dare un'occhiata a JConsole. Le cose possono essere difficile a seconda dello scopo della vostra misura. Se volete conoscere l'utilizzo della memoria del vostro programma Java allora gli strumenti che misurano l'utilizzo della memoria di un processo saranno imprecisi perché mostreranno memoria utilizzata dalla JVM così come il vostro programma.

Per quanto riguarda lo strumento massiccio si deve sapere che le parti della JVM saranno memorizzati nello stack, e il codice Java in sé potrebbe essere sul mucchio (dal momento che è una variabile della JVM), non so abbastanza su la JVM da dire.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top