There isn't any value in doing walk.release() until the finally block of call(), when you also monitor.endTask().  The temporary resources used by the RevWalk's internal ObjectReader is generally pretty light-weight and might as well stick around for the duration of the call.