Persistent resource consumption due to failure to close JGit objects
Investigating a heap dump from a suspiciously bloated backend service found a substantial number of integer arrays owned by live jgit objects.
I suspect this is a result of RJGit failing to close() AutoCloseable JGit objects - to test this hypothesis I've added:
module RJGit
class Repo
def close
@jrepo.close
end
end
end
And stuffed a call to this in an ensure block. I added a similar change to my variant of RJGit's Commit#stats call to close the DiffFormatter it uses.
After 12 hours the process has grown by about 100MB (post full-GC), which is considerably less than might have been expected prior.
After a day with thousands of commits processed, RES size after a full GC remains stable at ~1.5 GB.
Meanwhile its unpatched cousin is gobbling down 8 GB.
The evidence certainly seems to support the hypothesis. 😅 Thanks for looking into this. If you have time, would you mind opening a PR with your changes?
I have little more substantial than what's shown, and that requires a change more in applications than in RJGIt.
Thought probably needs to be given as to whether this requires or suggests a change in the API, or whether it can be better served by the use of finalizers.