生產環境 Tomcat 繁忙期拋 java.lang.OutOfMemoryError: unable to create new native thread。本文通過受控實驗 (2GB 記憶體、4 核 CPU、Tomcat 4.1.30、JMeter 壓測、JConsole 監控) 揭示 -Xmx、-Xms、-Xss 對線程上限的真實影響,並給出 Linux 核心參數調優方案。
Thread.sleep(30000) 保持請求佔用線程。java.lang.ThreadingMXBean)。| -Xmx | -Xms | -Xss | 崩潰線程數 |
|---|---|---|---|
| 500M | 500M | 128K | 642 |
| 800M | 800M | 64K | 485 |
| 1024M | 1024M | 64K | 374 |
| 1024M | 1024M | 128K | 374 |
| 1024M | 1024M | 512K | 371 |
4GB 進程虛擬地址空間
├── Kernel Space (1-2GB)
└── User Space (2-3GB)
├── JVM Heap (-Xmx)
├── PermGen / Metaspace
├── Code Cache
├── Direct ByteBuffer (-XX:MaxDirectMemorySize)
├── Thread Stacks (-Xss * threadCount) ← 瓶頸在這裡
├── JNI / Native Libraries
└── mmap 映射文件
# /etc/sysctl.conf
vm.max_map_count = 262144 # 預設 65530,每線程約需 1-2 個 VMA
sysctl -p
# /etc/security/limits.conf
tomcat soft as unlimited
tomcat hard as unlimited
# 或啟動腳本 ulimit -v unlimited
防止無限制創建線程耗盡 OS 資源。
jvm_threads_live、jvm_threads_daemon、jvm_threads_peak。jvm_memory_bytes_used{area="nonheap"} 監控非堆 (含線程棧)。jvm_threads_live > maxThreads * 0.8 觸發擴容/限流。