Первый запрос в 3:20 вызвал задержку некоторой памяти, но обратите внимание, что GC после второго запроса вернули большую часть. Также я думаю, что основной сбор был выполнен только после второго запроса в 4:40.
Похоже, утечки нет. Моя теория состоит в том, что запрос в 3:20 заставил молодое поколение заполниться, и в результате незначительный сборщик мусора продвинул некоторые объекты старшему поколению. Следующий крупный сборщик мусора, вызванный запросом в 4:40, очистил большинство из них.
Вы можете проверить это, используя профилировщик, чтобы пометить кучу, прежде чем выполнить тот же запрос, что и в 3:20, принудительно выполнить полный сборщик мусора и затем проверить, какие объекты задерживаются. Я не уверен, позволяет ли VisualVM (1) пометить кучу и (2) принудительно заполнить полный сборщик мусора, но OptimizeIt использовал это для этого.