Является ли потребление памяти Java хорошим показателем работоспособности веб-приложения?
Я реализовал сервлет Healthcheck на нашем сервере Jetty 8, используя Metrics. Помимо опроса нашего балансировщика нагрузки, метрики периодически (5 минут) записываются в файлы журнала. Кроме того, по электронной почте отправляются уведомления, когда некоторые показатели, такие как загрузка ЦП или потребление памяти, достигают критических пределов.
Это прекрасно работает для загрузки процессора и потребления системной памяти. Однако один из показателей, определенных для измерения потребления памяти JVM, регулярно превышает определенный порог в 95%, хотя сервер работает стабильно. Поэтому нам, возможно, придется переосмыслить наше решение по этому конкретному показателю. Это хороший показатель для проверки здоровья? Является ли это признаком утечки памяти, что наше веб-приложение регулярно достигает порогового значения до тех пор, пока не будет запущен сборщик мусора, или это нормальное поведение, которое следует ожидать для каждого долго работающего веб-приложения?
Спасибо за ваш вклад.
Вот наш Кодекс, который стимулирует проверку здоровья памяти JVM.
Java Runtime Memory
private final Runtime runtime = Runtime.getRuntime();
Result check() throws Exception {
final long freeMem = this.runtime.freeMemory();
// maxMemory() is the value set by the JVM -Xmx (Max HeapSize) parameter
final long maxMem = this.runtime.maxMemory();
final long usedMem = maxMem - freeMem;
final double value = RatioGauge.Ratio.of(usedMem, maxMem).getValue();
final double threshold = 0.95;
if (value < threshold) {
// Everything OK: Memory usage usage is below the threshold.
} else {
// NOT OK: Memory usage is above the threshold.
}
}
1 ответ
Вам необходимо установить базовый уровень. Пока ваше приложение работает нормально при желаемой нагрузке (количество запросов / сек, количество онлайн-пользователей и т. Д.), Любое потребление ресурсов процессора / памяти будет больше или меньше. Получив базовый уровень, вы можете добавить функции в свой код, а затем проверить, уменьшают ли они потребление или увеличивают ли эти функции и действуют ли они соответственно. Затем, при необходимости, вы будете оптимизировать места в коде, которые ухудшились после добавления функций (или вы обнаружите, что никакое локальное изменение кода не спасет вас, и вам нужно больше ресурсов для поддержки новых функций при данной нагрузке, или вам нужно изменить дизайн некоторых компоненты вашего приложения, но это уже другая история).
Таким образом, это не абсолютное значение, которое имеет наибольшее значение (хотя постоянное потребление кучи JVM на уровне 95% немного беспокоит), но изменение между изменениями кода.