2014-09-30 11 views
7

Ho profilato la versione x64 della mia applicazione poiché l'utilizzo della memoria è stato oltraggiosamente alto, tutto sembra provenire da JavaFX MediaPlayer, sto rilasciando correttamente gli ascoltatori e eventhandlers.Java - Consumo di memoria dispari tra x32 e x64

Ecco il netto contrasto.

La versione x32 all'avvio

enter image description here

E ora la versione x64 all'avvio

enter image description here

La versione x32 rimane sotto 256 MB, mentre il 64 sarà girato nel corso di un concerto; questo è mentre entrambi sono lasciati a giocare attraverso la loro playlist.

Tutto il codice è lo stesso.

JDK: jdk1.8.0_20

JRE: jre1.8.0_20

argomenti VM su entrambi i

-XX:MinHeapFreeRatio=40 -XX:MaxHeapFreeRatio=70 -Xms3670k -Xmx256m -Dsun.java2d.noddraw=true -XX:+UseParallelGC 

Stesso problema che si verificano su un'altra applicazione Java x64

enter image description here

È un bug o sto trascurando un po ' cosa?

risposta

3

Quello che vedete è l'utilizzo della memoria dell'intera JVM che esegue il vostro processo. L'impostazione -Xmx256m limita solo lo spazio heap massimo disponibile per l'applicazione da allocare (e la JVM lo imporrà). Al di fuori lo spazio di heap, la JVM può utilizzare memoria aggiuntiva per una serie di altri scopi (sono sicuro che mi mancherà un paio nella lista qui sotto):

  • PermGen, che ha ormai sostituito dal Metaspace. Secondo il documentation, non c'è limite predefinito per questo:.

    -XX:MaxMetaspaceSize=size 
    Sets the maximum amount of native memory that can be allocated for class metadata. By default, the size is not limited. The amount of metadata for an application depends on the application itself, other running applications, and the amount of memory available on the system. 
    
  • spazio di Pila (memoria usata = (numero di thread) * dimensione dello stack È possibile controllare questo con il parametro -Xss

  • off-heap spazio (sia uso di ByteBuffers nel codice, o l'uso di librerie di terze pary come EHCache che sarebbe in uso sua volta la memoria off-heap) codice

  • JNI

  • GC (netturbini hanno bisogno della loro propria memoria, che non è ancora parte del mucchio e può variare notevolmente a seconda del collettore utilizzato e l'utilizzo della memoria dell'applicazione)

Nel tuo caso, si sta vedendo il "quasi raddoppiando "l'uso della memoria, più probabilmente un'allocazione Metaspace più rilassante quando ci si sposta da una JVM a 32 bit a 64 bit. L'utilizzo di -XX:MaxMetaspaceSize=128m porterà probabilmente l'utilizzo della memoria a meno di 512 MB per la JVM a 64 bit.

+0

Non ero a conoscenza di queste modifiche e ho aggiunto il parametro al wrapper della mia applicazione e l'utilizzo della memoria è simile a quello dell'applicazione x32. Grazie. – user3037561

0

Non conosco la tua applicazione, rispettivamente come è implementata.

Una possibile causa di tali differenze sorprendenti potrebbe essere la quantità di memoria che può essere utilizzata prima che venga eseguita una garbage collection. È pensabile che una macchina con parole a 64 bit sia allocata con più memoria di una macchina con parole a 32 bit. Il garbage collector potrebbe essere eseguito meno spesso, quindi ci sarebbe ancora più memoria di immondizia allocata, anche quando non è realmente necessaria o utile.

Problemi correlati