看到了网上关于JVM最大线程数问题的讨论,通过查阅资料加试验,整理了一些笔记,分享在此。
首先说明两个概念:jvm限制,系统限制:
- jvm限制:jvm本身内存等因素对程序结果的影响,主要涉及参数:-Xms -Xmx -Xss
- 系统限制:linux内核限制,如可用系统内存,内核支持最大线程数,pid数,最大VMA映射数
Ubuntu 14.04 LTS
系统环境:
32位ubuntu
openjdk 32位 ,4g内存,经测试最大可设置堆内存 -Xmx2550m
jdk版本:
openjdk version “1.8.0_45-internal”
OpenJDK Runtime Environment (build 1.8.0_45-internal-b14)
OpenJDK Server VM (build 25.45-b02, mixed mode)
因为JVM创建内存一定会消耗heap内存,不做讨论,只实验堆外内存。
在Ubuntu上测试,经调试heap为19m(临界值,随着测试线程数增长而不会导致heap爆仓的最小堆内存),thread stack size(Xss)为最小100k(测试使用的jvm所允许的最小值)时,能达到最大线程数并抛出堆外内存不足异常,达到系统限制上限(非jvm上限)
命令:
java -Xmx19m -Xms19m -Xss100k JVMThreadLimitTest
输出:
cnt:26658 > thread-id-26666 waiting...
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:714)
at JVMThreadLimitTest.main(JVMThreadLimitTest