Я получаю эту ошибку на моем сервере UNIX при запуске моего сервера Java:
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 потоков или около того. Так что же происходит и как исправить пожалуйста?
Редактировать: это вывод 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
Edit2: я столкнулся с этим вопросом переполнения стека с помощью java-теста для потоков: how-many-threads-can-a-java-vm-support
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 и все такое. Это слишком много работы имо.
Полагаю, мне следует перейти на сервер Windows. Поскольку ни одна из настроек, предложенных на этой странице, не внесла никаких изменений: ограничение в моей системе составляет от 600 до 620 потоков, независимо от того, какая программа задействована.