我在运行我的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个线程运行,就会发生这种情况。
我已经在服务器上设置了这个variables:
$> ulimit -s 128
对我来说,看起来很奇怪的是这个命令的结果,这个命令是我上次发生错误时运行的:
在运行特定的Windows服务时,svchost.exe中的内存泄漏
带PAGE_GUARD的VirtualProtect不能使用局部variables
在Linux中计算内存区域的大小
是否会导致内存泄漏?
$> 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的输出,当我打开一个shell:
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:我遇到了这个堆栈溢出问题与线程的javatesting: 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个线程之后崩溃。 现在我确定这是不正常的,只与我的服务器configuration有关。 任何人都可以帮忙吗?
编辑3:我遇到了这篇文章,和其他许多人,解释说linux不能创build1000个线程 ,但你们告诉我,你可以在你的系统上做到这一点。 我不明白。
我也在我的服务器上运行了这个脚本: threads_limits.c ,限制大约是620个线程。
我的网站已经离线,这是我的项目可能发生的最糟糕的事情。 我不知道如何重新编译glibc和这个东西。 这是太多的工作艾莫。
我想我应该切换到Windows服务器。 因为在这个页面上提出的设置都没有做任何改变:我的系统的限制是600到620个线程,不pipe涉及的程序如何。
什么限制了我的PHP资源?
从正在运行的Java程序的内存中查找并读取特定types的对象
强制释放()将malloc内存返回给操作系统
Windows保护模式 – 内存
C记忆问题
刚刚得到以下信息:这是我的主机提供商施加的限制。 这与编程或linux无关。
底层操作系统(在这种情况下,Debian Linux)不允许进程创建更多的线程。 在这里看看如何提高最大数量: Linux中每个进程的最大线程数?
我在互联网上看到,我的程序应该处理5000线程左右。
这取决于设置给操作系统的限制,正在运行的进程的数量等。使用正确的设置,您可以轻松访问多个线程。 我在自己的计算机上运行Ubuntu,创建大约32000个线程,然后在单个Java程序的限制下运行所有“正常的东西”在后台运行(这是通过一个测试程序完成的,立即在无限循环中睡觉)。 当然,大量的线程实际上在做些什么,可能会让消费者的硬件很快就停下来。
你可以用更小的堆栈大小“-Xss64k”来尝试相同的命令并传递结果吗?
我开始怀疑“Native Posix线程库”缺失。
>getconf GNU_LIBPTHREAD_VERSION
NPTL 2.13
如果没有,Debian的安装就搞砸了。 我不知道如何解决,但安装ubuntu服务器似乎是一个很好的举措…
为ulimit -n 100000; (打开fd:s)下面的程序应该能够处理32.000个线程左右。
尝试一下:
package test; import java.io.InputStream; import java.net.serverSocket; import java.net.socket; import java.util.ArrayList; import java.util.concurrent.Semaphore; public class Test { final static Semaphore ss = new Semaphore(0); static class TT implements Runnable { @Override public void run() { try { Socket t = new Socket("localhost",47111); InputStream is = t.getInputStream(); for (;;) { is.read(); } } catch (Throwable t) { System.err.println(Thread.currentThread().getName() + " : abort"); t.printstacktrace(); System.exit(2); } } } /** * @param args */ public static void main(String[] args) { try { Thread t = new Thread() { public void run() { try { ArrayList<Socket> sockets = new ArrayList<Socket>(50000); serverSocket s = new serverSocket(47111,1500); ss.release(); for (;;) { Socket t = s.accept(); sockets.add(t); } } catch (Exception e) { e.printstacktrace(); System.exit(1); } } }; t.start(); ss.acquire(); for (int i = 0; i < 30000; i++) { Thread tt = new Thread(new TT(),"T" + i); tt.setDaemon(true); tt.start(); System.out.println(tt.getName()); try { Thread.sleep(1); } catch (InterruptedException e) { return; } } for (;;) { System.out.println(); try { Thread.sleep(1000); } catch (InterruptedException e) { return; } } } catch (Throwable t) { t.printstacktrace(); } } }
您的JVM无法分配堆栈或其他每个线程的内存。 使用-Xss降低堆栈大小将有助于增加可以在OOM发生之前创建的线程数(但JVM不会让您设置任意小的堆栈大小)。
您可以通过查看创建的线程数量如何调整-Xss或通过在JVM上运行strace来确认这是问题所在(几乎可以肯定地看到在抛出异常之前返回ENOMEM的mmap() )。
检查你的虚拟大小ulimit -v ,即ulimit -v 。 增加这个限制应该让你用相同的堆栈大小创建更多的线程。 请注意, 在当前的Linux内核中 ,驻留集大小限制( ulimit -m )是无效的 。
另外,通过为线程堆栈留下更多内存,可以降低-Xmx 。
它的内存不足。
还需要更改ulimit。 如果你的操作系统不给你的应用程序足够的内存-Xmx我想不会有什么区别。
我猜测-Xmx500m没有任何作用。
尝试
ulimit -m 512m与-Xmx512m
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。