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
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.
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.
- 1. La mia memoria non è libera
- 2. Delphi - Minimizza e ripristina libera memoria?
- 3. Memoria libera da AnimationDrawable
- 4. Imposta l'array numpy su Nessuna memoria libera?
- 5. Memoria libera durante il ciclo
- 6. Realloc() non libera correttamente la memoria in Windows
- 7. Memoria libera utilizzata da uno std :: string
- 8. Memoria libera allocata in una funzione diversa?
- 9. R non utilizza più di 4 GB di memoria
- 10. C++ cancella vettore, oggetti, memoria libera
- 11. esecuzione modalità silenziosa con java.exe
- 12. Come si libera la memoria ottenuta da sbrk()?
- 13. i file binari a 64 bit del cacao perdono memoria? (Rilasciando NSData non libera memoria)
- 14. Assegnazione memoria memoria e lastra
- 15. layout memoria processo windows
- 16. Solr utilizza troppa memoria
- 17. C++ e protezione da memoria di processo
- 18. Qual è la differenza tra "system32 \ java.exe" e "Programmi \ Java \ jdk1.6.0_33 \ bin \ java.exe"?
- 19. Più thread e memoria
- 20. Perché rimuovere contenitori e immagini docker non libera lo spazio di archiviazione su Windows? Come sistemarlo?
- 21. Il processo javaw.exe in Windows 64 consuma più memoria?
- 22. PhoneGap che utilizza più memoria in iOS8 che in iOS7
- 23. Does StringBuilder utilizza più memoria rispetto alla concatenazione di stringhe?
- 24. MongoDB utilizza troppa memoria
- 25. Utilizza CPU e RAM
- 26. NewStringUTF() e liberare memoria
- 27. Password nella memoria del processo ma non nel dump dell'heap
- 28. Utilizzo memoria di un processo figlio?
- 29. Perché lo standard HL7 non utilizza XML?
- 30. Come ottenere la memoria disponibile/libera da ADB?
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. –
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
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. –