У нас есть приложение j2ee, работающее на Jboss, и мы хотим отслеживать его использование в памяти. В настоящее время мы используем следующий код
System.gc();
Runtime rt = Runtime.getRuntime();
long usedMB = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;
logger.information(this, "memory usage" + usedMB);
Этот код работает нормально. Это означает, что он показывает кривую памяти, которая соответствует действительности. Когда мы создаем большой XML файл из БД, кривая поднимается, после завершения извлечения она опускается.
Консультант сказал нам, что вызов gc() явно неверен, "пусть jvm решит, когда запускать gc". В основном его аргументы были такими же, как здесь обсуждались. Но я до сих пор не понимаю:
- Как я могу использовать кривую использования памяти?
- Что не так с явным gc()? Меня не волнуют небольшие проблемы с производительностью, которые могут возникнуть с явным gc() и которые я буду оценивать в 1-3%. Мне нужен монитор памяти и потока, который помогает мне в анализе нашей системы на сайте клиента.