Java applications must typically devote a thread to each connection on which they receive data. Threads and sockets are system resources and, as such, are finite commodities. Moreover, they consume other system resources like virtual memory. Once the thread, socket, or memory limit is reached, no further connections can be established. One of the goals of the IBM Win32 JVM on Windows NT was to extend the connection limit within the constraints of the operating system.
Threads consume virtual memory due to the existence of a thread stack.
On Windows NT, the amount specified via -ss defines the amount of virtual memory actually allocated for each of the JVM's thread stacks. However, unless otherwise specified, the OS still reserves 1 MB of virtual memory by default for each thread. The IBM Win32 JVM achieves a much higher effective thread limit by reducing the virtual memory reservation per thread from its 1-MB default. Some form of multiplexing many connections to a single thread is required.