rjgit icon indicating copy to clipboard operation
rjgit copied to clipboard

Persistent resource consumption due to failure to close JGit objects

Open Freaky opened this issue 5 years ago • 3 comments

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.

Freaky avatar Feb 20 '21 17:02 Freaky

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.

Freaky avatar Feb 21 '21 03:02 Freaky

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?

bartkamphorst avatar Feb 22 '21 08:02 bartkamphorst

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.

Freaky avatar Feb 22 '21 16:02 Freaky