I typically use solution #2 as most of time the contents of the ring
buffer are an event off of the wire in it's serialised form, i.e. a
byte array. Therefore most of the translation into an event in the
ring buffer is a simple array copy. Using #1 can work, but there are
a couple of niggles. Because you have a holder object for each event
you end up with a second indirection that the GC has to pass through,
which can extend the length of GC pauses, especially if your buffer is
large. Secondly, you need to manually null out the entry in the
buffer after your last event handler has completed otherwise your
objects in the array will end up hanging around for much longer and
therefore have a higher probability of escaping the new space again
increasing GC times.
Mike