I Will Get That Job At Google. | Why using many threads in Java is bad
Each OS and JVM has its own thread settings and there is no concrete value of max thread limit. But it can be easily calculated. Using a lot of threads is bad not only because of their consumption.
Thread lifecycle overhead
Thread creation and teardown are not free. The actual overhead varies across platforms, but thread creation takes time, introducing latency into request processing, and requires some processing activity by the JVM and OS. If requests are frequent and lightweight, as in most server applications, creating a new thread for each request can consume significant computing resources.
Context switch
When OS decides to switch to another thread execution, there is a context switch - all the registers and data are being pushed to memory, CPU and RAM are being tuned to another thread, another thread restores its state agein etc. These operations aren’t too slow, but when there are hundreds or even thousands of threads, it can be a real disaster. OS will work inefficiently and most of time will be used to switch one context to another.
Thread data
Each thread had its stack (quite huge block, usually 256 Kb by default), its descriptors. Threads also may have ThreadLocal variables. With default settings only 4 threads consume 1 Mb of memory. It’s quite huge amount of memory!
System overhead
Thread creation in Java forces OS to create a memory block for stack and other data. It is done using system calls. The thread stack is allocated by the call to pthread_create that also creates the native thread. (The JVM does not pass pthread_create a preallocated stack.)
Then, within pthread_create the stack is allocated by a call to mmap as follows:
mmap(0, attr.__stacksize, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
That means that for each thread at least one system native thread is being executed to prepare memory for it. It also has some overhead.
Efficiency comparison table
The one and only solution is to use horizontal scaling and to use thread pools which can help to re-use created threads. Don’t forget to reset ThreadLocal values!
Resources
Java Concurrency in Practice
Read full article from I Will Get That Job At Google. | Why using many threads in Java is bad