Java 内存错误:无法创建新的本机线程
我在运行 Java 服务器时在 UNIX 服务器上收到此错误:
Exception in thread "Thread-0" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:640)
at [... where ever I launch a new Thread ...]
每当我有大约600个线程运行时,就会发生这种情况。
我已经在服务器上设置了这个变量:
$> ulimit -s 128
对我来说很奇怪的是这个命令的结果,我在上次发生错误时运行了这个命令:
$> free -m
total used free shared buffers cached
Mem: 2048 338 1709 0 0 0
-/+ buffers/cache: 338 1709
Swap: 0 0 0
我像这样启动我的Java服务器:
$> /usr/bin/java -server -Xss128k -Xmx500m -jar /path/to/myJar.jar
我的 debian 版本:
$> cat /etc/debian_version
5.0.8
我的java版本:
$> java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
我的问题:我在互联网上读到我的程序应该处理大约5000个线程。那么发生了什么,以及如何解决请?
编辑:这是我打开shell时的输出:ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 794624
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 100000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 794624
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
我从init.d将脚本作为守护进程运行,这就是我运行的:
DAEMON=/usr/bin/java
DAEMON_ARGS="-server -Xss128k -Xmx1024m -jar /path/to/myJar.jar"
ulimit -s 128 && ulimit -n 10240 && start-stop-daemon -b --start --quiet --chuid $USER -m -p $PIDFILE --exec $DAEMON -- $DAEMON_ARGS \
|| return 2
编辑2:我在线程的java测试中遇到了这个堆栈溢出问题:如何-多少-线程-可以-a-java-vm-支持
public class DieLikeADog {
private static Object s = new Object();
private static int count = 0;
public static void main(String[] argv){
for(;;){
new Thread(new Runnable(){
public void run(){
synchronized(s){
count += 1;
System.err.println("New thread #"+count);
}
for(;;){
try {
Thread.sleep(100);
} catch (Exception e){
System.err.println(e);
}
}
}
}).start();
}
}
}
在我的服务器上,程序在613个线程后崩溃。现在我确定这是不正常的,只与我的服务器配置有关。任何人都可以帮忙吗?
编辑3:我遇到了这篇文章,以及许多其他文章,解释说linux不能创建1000个线程,但你们告诉我,你可以在你的系统上做到这一点。我不明白。
我还在我的服务器上运行了这个脚本:threads_limits.c,限制大约是620个线程。
我的网站现在处于离线状态,这是我的项目可能发生的最糟糕的事情。我不知道如何重新编译glibc和这些东西。这是太多的工作 imo。
我想我应该切换到Windows服务器。因为此页面上建议的设置均未进行任何更改:无论涉及哪个程序,我的系统上的限制都在600到620个线程之间。