我想知道:我的系统可以运行50000没有。并行线程/进程与否?
为此,我将'ulimit max process'和'/ proc / sys / kernel / pid_max'更改为50000。 但我仍然无法跨越〜33000没有。进程/线程。
算不算。我正在使用的系统上的进程/线程:ps -eL | wc -l 我写了一个java程序来创建那些没有。线程。
但最后我得到了这个例外:
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to protect stack guard pages failed.
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to protect stack guard pages failed.
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to protect stack guard pages failed.
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
Total thread created #**32515**
Exception in thread "main" 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 HowManyThreads.main(HowManyThreads.java:12)
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to allocate stack guard pages failed.
^CJava HotSpot(TM) 64-Bit Server VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminated
请帮我创建50000没有。进程/线程。
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 2066250
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 150000
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) 40000
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
cat / proc / sys / kernel / pid_max
50000
Java程序
package create.threads;
public class HowManyThreads
{
private static Object s = new Object();
private static int count = 0;
public static void main(String[] argv)
{
try
{
for(;;)
{
new Thread(new Runnable()
{
public void run()
{
synchronized(s)
{
count += 1;
}
for(;;)
{
try
{
Thread.sleep(1000);
} catch (Exception e){
System.out.println(e);
}
}
}
}).start();
}
}
finally
{
System.out.println("Total thread created #"+count);
}
}
}
这是我系统上的免费命令输出: 当我的程序运行并抛出错误/异常
free -g
total used free shared buffers cached
Mem: 252 3 248 0 0 0
-/+ buffers/cache: 3 249
Swap: 1 0 1
当我不运行此程序时
free -g
total used free shared buffers cached
Mem: 252 2 250 0 0 0
-/+ buffers/cache: 1 250
Swap: 1 0 1
你可以帮助我......我错过了什么......
答案 0 :(得分:1)
线程使用堆上的内存(惊喜!)
您可以通过向Java程序提供更多堆来解决您的问题:
java -Xmx1024m <whatever comes for your application>
为1gib的内存。
对于一个线程,经验法则是1mb,所以如果你想要50k线程,你需要50GB的内存。
要降低此值,可以减少每个线程的堆栈大小
java -Xss512k
对于512k的堆栈,对于您的特定示例,您可能只用1k甚至更少。 The default for Linux x64 seems 256k
但是我宁愿质疑为什么你需要这么多线程来做事情。您应该使用与处理器核心中的任何内容匹配的线程池,然后只安排要在此池上执行的工作。
答案 1 :(得分:1)
我认为这不是进程数量而是内存:
线程“main”中的异常java.lang.OutOfMemoryError:无法创建新的本机线程 at java.lang.Thread.start0(Native Method) 在java.lang.Thread.start(Thread.java:640) 在HowManyThreads.main(HowManyThreads.java:12)
这个例子只是“内存不足”吗?
但还有一些限制:
每个进程打开stdin / stdout / stderror,这意味着3个文件。 50k线程意味着150K文件。
但是你可以在这里阅读:Maximum number of threads per process in Linux?
每个进程的线程数主要受内存大小的限制。