2013-05-20 16 views
5

Ho un'applicazione java che quando in stato di inattività prima di qualsiasi esecuzione complessa, utilizza 23 MB in Heap e la dimensione del processo java.exe in TaskManager era di circa 194 MB. Dopo alcune operazioni complesse, le dimensioni di java.exe sono cresciute fino a circa 500 MB e anche le dimensioni dell'heap sono cresciute. La dimensione dell'heap viene ridotta a 23 MB dopo alcuni GC completi chiamando il metodo System.gc(). Ma le dimensioni di java.exe sono ridotte a circa 237 MB da circa 600 MB, che contengono ancora circa 43 MB di dati. C'è un modo per ridurre questo? O è dovuto a qualche comportamento?java.exe processo utilizza più memoria e non lo libera

risposta

11

Questo è normale, non preoccuparti. JVM acquisisce memoria quando è necessario eseguire una logica complessa. Quando java ha finito di elaborare le attività, la JVM continuerà a conservare quella memoria come spazio riservato e non verrà rilasciata nuovamente al sistema operativo. Questa architettura aiuta nelle prestazioni perché JMV non deve richiedere di nuovo la stessa memoria dal sistema operativo sottostante. Rimarrà all'interno dell'intervallo definito nel parametro -Xmx JVM.

Vedere questo collegamento IBM per alcuni dettagli interessanti. http://www-01.ibm.com/support/docview.wss?uid=swg21326774

Sfortunatamente questa è una delle aree grigie di JVM; in realtà non si ha molto controllo su come OS e JVM condividano la memoria l'uno con l'altro. Pensa a JVM come a un sistema operativo virtuale che richiede un po 'di memoria per funzionare. Sia il sistema operativo principale che la VM sono affamati di risorse e desiderano aggrapparsi alle risorse acquisite con la maggiore quantità di memoria possibile. Richiedere più memoria dal sistema operativo è un'operazione che richiede molto tempo, pertanto la maggior parte delle JVM non rilasciano la memoria sul sistema operativo anche quando non ne ha più bisogno.

Vedere questo white paper da Oracle per ulteriori dettagli sulla gestione della memoria JVM interna. http://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150215.pdf

Suggerirei di leggere prima il collegamento IBM e quindi è possibile approfondire lo strano mondo della memoria spiegato nel white paper. Entrambi questi link sono molto istruttivi e interessanti.

+0

Ma l'opzione -Xmx consente di impostare la dimensione dell'heap giusta? Per me l'heap utilizzato viene restituito al sistema operativo quando lo controllo con VisualVM e YourKit Java Profiler. La dimensione dell'heap non è un problema poiché il processo ha la stessa quantità di dimensione dell'heap che aveva prima del processo. Ma il processo java.exe in Task Manager di Windows utilizza più della quantità di memoria che stava usando in precedenza. –

+0

La maggior parte della vostra comprensione è corretta; a parte "l'heap usato viene restituito al sistema operativo".La memoria heap viene restituita alla JVM per altri oggetti, non il sistema operativo sottostante. Ecco perché in windows java.exe sembra utilizzare molta più memoria di quanto ci si aspetti. – Raza

+0

Tuttavia, quando la dimensione heap è stata ridotta da 500 MB a 23 MB, il processo Java.exe è stato ridotto da circa 600 MB a 237 MB, quindi ho presupposto che l'heap rimanente ridotto venga restituito al sistema operativo. Se non viene ridotto, anche la dimensione dell'heap è scesa da 500 MB, la dimensione di java.exe deve essere di circa 600 MB. Mi dispiace di aver dimenticato di dire che java.exe era circa 600 MB prima. –

2

OS impronta del processo java sono composti da

  • java mucchio (la sua dimensione in limitato da -Xmx)
  • classi Java metadati correlati (o generazione permanente in HotSpot JVM)
  • memoria non mucchio accessibile tramite NIO
  • spazio di stack dei thread

Alcuni spazzatura Raccolte gli algoritmi di tion stanno restituendo la memoria libera al sistema operativo, altri no. In HotSpot JVM, il collector di spazio vecchio seriale (solitamente abilitato per impostazione predefinita) restituisce la memoria al sistema operativo (in modo che sia possibile vedere il restringimento del processo). Tuttavia, altri collettori come -XX:+UseParallelOldGC o -XX:+UseConcMarkSweepGC non restituiranno mai memoria heap inutilizzata al sistema operativo.

HotSpot JVM ha opzioni per gestire/limitare tutte le aree di memoria menzionate sopra, è possibile trovare l'elenco completo delle opzioni JVM relative al dimensionamento della memoria e all'ottimizzazione GC in my blog.

Problemi correlati