> * Marshalling happens in the async thread (the same one that puts the message on the wire) rather than in the caller's thread
my understanding is that there's no such additional thread, but caller's thread goes to the network stack even for async calls. I think Bela can put some light on this.

If you use bundling, the bundler thread writes the bytes to the socket, not the caller's thread. TCP also uses a special sender thread for each connection, if use_sender_queues=true (the default).

 
> * sendMessage() should accept a marshaller and unmarshaller per invocation

There is a org.jgroups.Buffer that we pass to the org.jgroups.Message we send across, another, less intrusive way would be to write a lazy wrapper around it.


Still, FRAG2 needs the actual bytes of the message, and that's a long time before the message gets passed to the bundler thread.

Cheers
Dan