Thread Allocation for Connections

When the Message Queue client runtime creates a connection, it creates
two threads: one for consuming messages from the socket, and one to manage
the flow of messages for the connection. In addition, the client runtime creates
a thread for each client session. Thus, at a minimum, for a connection using
one session, three threads are created. For a connection using three sessions,
five threads are created, and so on.

Managing threads in a JMS application often involves trade-offs
between performance and throughput. Weigh the following considerations when
dealing with threading issues.

When you create several asynchronous message consumers in
the same session, messages are delivered serially by the session thread to
these consumers. Sharing a session among several message consumers might starve
some consumers of messages while inundating other consumers. If the message
rate across these consumers is high enough to cause an imbalance, you might
want to separate the consumers into different sessions. To determine whether
message flow is unbalanced, you can monitor destinations to see the rate of
messages coming in. See Chapter 4, Using the Metrics Monitoring API.

You can reduce the number of threads allocated to the client
application by using fewer connections and fewer sessions. However, doing
this might slow your application’s throughput.

You might be able to use certain JVM runtime options to improve
thread memory usage and performance. For example, if you are running on the
Solaris platform, you may be able to run with the same number (or more) threads
by using the following vm options with the client: Refer
to the JDK documentation for details.

Use the Xss128K option to decrease the
memory size of the heap.

Use the xconcurrentIO option to improve
thread performance in the 1. 3 VM.