Abbiamo un'applicazione j2ee in esecuzione su Jboss e vogliamo monitorare l'utilizzo della memoria. Attualmente viene utilizzato il seguente codiceCome monitorare l'utilizzo della memoria Java?
System.gc();
Runtime rt = Runtime.getRuntime();
long usedMB = (rt.totalMemory() - rt.freeMemory())/1024/1024;
logger.information(this, "memory usage" + usedMB);
Questo codice funziona correttamente. Ciò significa che mostra una curva di memoria che corrisponde alla realtà. Quando creiamo un grande file xml da un DB, una curva sale, dopo che l'estrazione è finita, scende.
Un consulente ci ha detto che chiama gc() è esplicitamente sbagliato "lasciare che JVM decidere quando eseguire gc". Fondamentalmente i suoi argomenti erano gli stessi di disscussed here. Ma ancora non capisco:
- come posso avere la mia curva di utilizzo della memoria?
- Cosa c'è di sbagliato con l'esplicito gc()? Non mi importa dei piccoli problemi di prestazioni che possono verificarsi con gc esplicito() e che stimerei nell'1-3%. Ciò di cui ho bisogno è il monitoraggio della memoria e del filo che mi aiuta nell'analisi del nostro sistema sul sito del cliente.
monitor con jvisualvm - fornisce statistiche migliori. –