The first request at 3:20 made some memory hold, but note that the GC after the second request was most corrected. I also think that the main GC was executed only after the second request at 4:40.
There seems to be no leak. My theory is that the request at 3:20 made the younger generation fill up, and the received younger GC promoted some objects to the older generation. The next major GC, triggered by a request at 4:40, cleared most of them.
You can verify this using the profiler to mark the heap before issuing the same query as the one at 3:20, forcing a full GC, and then checking which objects are delayed. I'm not sure if VisualVM allows you to (1) flag a bunch and (2) force the use of the full GC, but OptimizeIt is used for this.
Binil Thomas
source share