With the addition of TCP_NIO2, all bundlers now create new send buffers for every message (or message list). This generates a lot of memory allocations, perhaps it is better to revert this change for synchronous transports such as UDP and TCP, and still create new buffers for asynchronous transports such as TCP_NIO2.
Synchronous transports guarantee a message has been put on the wire when TP.send() returns, whereas asynchronous transports may only have completed a partial write (so we cannot reuse the buffer).
The code in the bundler should check for this, and copy if async or not copy if sync.
Whether or not a transport is sync is determined by a new abstract method that needs to be overridden by every transport.