The intent of this function, with copy=false, is to avoid allocations and copies, but we allocated an array in this() and are now discarding it.

Lots of stuff is done in ArrayEvent().  It could be put into a function (called exactly once by all constructors) or we could just make the root constructor ArrayEvent(byte[]), making ArrayEvent() call this(new byte[MAX_MESSAGE_SIZE]).  If the latter, ArrayEvent(byte[],boolean) would call this(copy ? new byte[MAX_MESSAGE_SIZE] : bytes), followed by "if (copy) { System.arraycopy(bytes, 0, this.bytes, 0, length); }"