JVM最大线程数

JVM最大线程数

至于操作系统栈大小(ulimit -s):这个配置只影响进程的初始线程;后续用pthread_create创建的线程都可以指定栈大小。HotSpot VM为了能精确控制Java线程的栈大小,特意不使用进程的初始线程(primordial thread)作为Java线程。

不显式设置-Xss或-XX:ThreadStackSize时,在Linux x64上ThreadStackSize的默认值就是1024KB

  • StackOverflowError (the stack size is greater than the limit), increase the value
  • OutOfMemoryError: unable to create new native thread (too many threads, each thread has a large stack), decrease it.

JVM中可以生成的最大数量由JVM的堆内存大小、Thread的Stack内存大小、系统最大可创建的线程数量(Java线程的实现是基于底层系统的线程机制来实现的,Windows下_beginthreadex,Linux下pthread_create)三个方面影响。

具体数量可以根据Java进程可以访问的最大内存(32位系统上一般2G)、堆内存、Thread的Stack内存来估算。

1
(MaxProcessMemory - JVMMemory – ReservedOsMemory) / (ThreadStackSize) = Number of threads
  • MaxProcessMemory : 进程的最大寻址空间
  • JVMMemory : JVM内存
  • ReservedOsMemory : 保留的操作系统内存,如Native heap,JNI之类,一般100多M
  • ThreadStackSize : 线程栈的大小,jvm启动时由Xss指定

综上所述:

jvm的最大线程数受一下jvm参数限制

-Xms 最小堆内存 -Xmx 最大堆内存 -Xss 设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M

线程数量 = (机器本身可用内存 - JVM分配的堆内存) / Xss的值。

补充下: jvm线程数还和系统的最大线程限制有关:

操作系统限制 系统最大可开线程数,主要受以下几个参数影响

​ /proc/sys/kernel/pid_max

​ /proc/sys/kernel/thread-max 系统可以生成最大线程数量

​ /proc/sys/vm/max_map_count 文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量 。单个JVM能开启的最大线程数是/proc/sys/vm/max_map_count的设置数的一半

https://segmentfault.com/a/1190000004694232

https://www.oschina.net/translate/understanding-virtual-memory?print