Wir haben eine J2ee-Anwendung, die auf Jboss läuft, und wir wollen ihre Speichernutzung überwachen. Derzeit verwenden wir den folgenden Code
System.gc();
Runtime rt = Runtime.getRuntime();
long usedMB = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;
logger.information(this, "memory usage" + usedMB);
Dieser Code funktioniert gut. Das heißt, er zeigt eine Speicherkurve, die der Realität entspricht. Wenn wir eine große XML-Datei aus einer DB erstellen, geht die Kurve nach oben, nachdem die Extraktion beendet ist, geht sie nach unten.
Ein Berater sagte uns, dass der explizite Aufruf von gc() falsch sei, "lass jvm entscheiden, wann gc ausgeführt werden soll". Im Grunde waren seine Argumente die gleichen wie hier erörtert . Aber ich verstehe es immer noch nicht:
- Wie kann ich meine Speichernutzungskurve anzeigen lassen?
- Was ist falsch an der expliziten gc()? Ich interessiere mich nicht für kleine Leistungsprobleme, die bei explizitem gc() auftreten können und die ich auf 1-3% schätzen würde. Was ich brauche, ist ein Speicher- und Thread-Monitor, der mir bei der Analyse unseres Systems auf der Kundenseite hilft.