在 Ubuntu 上运行 Java 程序时“线程报错”是一个比较宽泛的说法,常见原因和排查思路如下:
java.lang.OutOfMemoryError: unable to create new native thread最常见于 Ubuntu / Linux
原因:
排查:
# 查看当前用户线程限制
ulimit -u
# 查看某 Java 进程线程数
ps -eLf | grep java | wc -l
# 查看系统最大进程/线程数
cat /proc/sys/kernel/threads-max
解决:
ulimit -u/etc/security/limits.conf-Xss(栈大小)java.lang.InterruptedException原因:
sleep / wait / join 时被中断ExecutorService.shutdownNow())处理:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 恢复中断状态
}
java.lang.NullPointerException(在线程中)原因:
解决:
volatile / synchronized / Lockjava.util.concurrent.RejectedExecutionException原因:
AbortPolicy解决:
CallerRunsPolicyStackOverflowError原因:
-Xss 设置过小如果是 systemd 启动的 Java:
[Service]
TasksMax=infinity
否则默认可能限制线程数。
在 Ubuntu + Docker 中:
pids limit 很低ulimit 不生效解决:
docker run --pids-limit=100000 ...
请补充:
java -versionlsb_release -a如果你愿意,可以直接把报错日志贴出来,我可以帮你逐行分析。