У меня есть длинный Java-сервис (Jetty/CometD), который имеет утечку памяти (тема для другого дня), поэтому куча постоянно увеличивается/стабильно время (но разные с разными сборки/настройки и т.д.)Java: Рассчитать среднее увеличение кучи за X единицу времени с карты <Long, Long>
Я беру образцы размером кучи в течение долгого времени (каждые 15 минут или около того) и хранить их в HashMap определены следующим образом:
// heapSizeMap uses the current timestamp for the key
// and the size of the heap in MB as the val
Map<Long, Long> heapSizeMap = new HashMap<>();
и функция, которая вызывается для добавления к карте:
public void addToHeapMap() {
Runtime runtime = Runtime.getRuntime();
int mb = 1024*1024;
Long currentHeap = (runtime.totalMemory() - runtime.freeMemory())/mb;
heapSizeMap.put(new Date().getTime(), currentHeap);
}
У меня есть карта, которая позволяет мне графически отображать размер кучи с течением времени, и почти линейный рост с течением времени довольно очевиден.
.
Мой вопрос: что было бы лучшим способом вычислить среднюю скорость изменения (увеличение/рост в моем случае) в динамической памяти как что-то вроде X МБ в час (или X МБ на Y единицу времени)
В настоящее время я просто сортирую весь набор данных в javascript и даю приблизительные оценки, такие как изменение размера кучи за последние 24 часа (с использованием текущей кучи, минус куча 24 часа назад) или вычисления изменения для каждый час за последние 24 часа и усреднение и т. д.
Очевидно, что это может быть довольно неточно, особенно до того, как куча начнет изменять размер до того, как достигнет начального размера кучи (с использованием -Xms512m -Xmx14g), а колебания в размере кучи понятны вверх и вниз, а когда выбрана куча, нет реального способа узнать, было ли это сразу после GC, как раз перед этим, или где-то посередине (причина Я бы хотел рассчитать среднюю скорость роста кучи, например, 50 МБ в час или что-то в этом роде).
Есть ли простой или полустандартный способ сделать это? Не нужно быть супер точными, но искать что-то лучше (и Java родной), чем текущий способ обработки я это ... Спасибо
Почему бы не просто профилировать приложение и не исправить утечку памяти? Я бы сказал, что это пустая трата времени, если вы не создаете продукт, который касается утечек памяти или чего-то связанного. – Kayaman
Похоже, вы хотите, чтобы была выполнена кривая [простая линейная регрессия] (https://en.wikipedia.org/wiki/Simple_linear_regression). Наклон результирующей линии - это MB/время, которое вы хотите. –
@ Kayaman Я хотел бы исправить утечку памяти, но я проанализировал кучи кучи и использовал профилировщик YourKit, чтобы попытаться определить, где находится курящее оружие, однако до сих пор я дошел до пустого. Я до сих пор довольно новичок в этой части разработки Java и, к сожалению, не могу найти источник проблемы. Хотя я не сдаюсь, но хотел бы рассчитать рост (и, надеюсь, увидим, что все ближе и ближе к 0, поскольку я исправляю утечки) – giantNinja