1) Disable the Nagle algorithm (http://en.wikipedia.org/wiki/Nagle%27s_algorithm) on your TCP sockets:
Using Apache MINA NIO transport for clients:
NioSocketConnector connector = new NioSocketConnector();
((SocketSessionConfig) connector.getSessionConfig()).setTcpNoDelay(true); // DISABLE NAGLE
((SocketSessionConfig) connector.getSessionConfig()).setTcpNoDelay(true); // DISABLE NAGLE
Using Apache MINA NIO transport for servers:
NioSocketAcceptor acceptor = new NioSocketAcceptor();
((SocketSessionConfig) acceptor.getSessionConfig()).setTcpNoDelay(true); // DISABLE NAGLE
((SocketSessionConfig) acceptor.getSessionConfig()).setTcpNoDelay(true); // DISABLE NAGLE
In QuickFIX/J settings:
SocketTcpNoDelay=Y
2) Understand how your application is performing Garbage Collection (GC)
Firstly turn on GC logging using these VM switches
-verbose:gc -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
Secondly consider how many objects your application is creating - more objects = more GC.
Consider if using a primitive is more appropriate than an object since primitives are not stored on the heap and so do not affect the GC.