We create threads in application to improve performance. So, how many maximum threads can we create?? You might wondering we can create threads as much as memory is available in system. So If you try running below program, what is the output you are going to get??
package com.whiteboardtalks.threads; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class MaxThreadCount { public static void main(String[] args) throws InterruptedException { int i = 0; BlockingQueue<String> queue = new ArrayBlockingQueue<>(10); while(true) { i++; System.out.println(i); new Thread(() -> { try { queue.take(); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } } }
2026 2027 2028 2029 Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.start0(Native Method) at java.lang.Thread.start(Thread.java:717)
So, only 2029 threads in my application. I am running this program MacOS High Sierra 10 with 8 GB RAM. So, if you see memory footprint of this program using jvisualvm, it will be very less. So, what is limiting to create more threads??
In OS, we have system limits. If you run below command on linux, you will get some number. That’s the limiting factor.
ulimit -u
In MacOS, we can check using below command.
sysctl kern.num_taskthreads
Changing threads limit in Linux:
/etc/security/limits.conf
file:admin soft nproc 4096
admin hard nproc 16384
If you want to change for all user, use * in place of username.
* soft nproc 4096
* hard nproc 16384
Save file and restart the process or terminal.
Soft Limit vs Hard Limit
- A hard limit is the maximum allowed to a user, set by the root. This value is set in the file /etc/security/limits.conf.
- A soft limit is the value right now for that user. The user can increase the soft limit on their own in times of needing more resources, but cannot set the soft limit higher than the hard limit.