linux最大线程数

Fre*_*dom 2 java linux jvm

我使用以下代码来测试最大线程数,但这很奇怪。

import java.util.concurrent.atomic.AtomicInteger;

public class TestThread extends Thread {
    private static final AtomicInteger count = new AtomicInteger();

    public static void main(String[] args) {
        try{
            while (true) {
                (new TestThread()).start();
            }
        } catch (Error | Exception e) {
            System.out.println(e.getMessage());
        }
    }

    @Override
    public void run() {
        System.out.println(count.incrementAndGet());
        while (true)
            try {
                Thread.sleep(Integer.MAX_VALUE);
            } catch (InterruptedException e) {
                break;
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

操作系统为ubuntu:18.04,内存为4G,处理器数为2。JDK:openjdk1.8.0_252

java -Xss1m -Xms1024m -Xmx1023m TestThread

java -Xss512k -Xms1024m -Xmx1023m TestThread

java -Xss1m -Xms2048m -Xmx2048m TestThread

结果,线程数始终等于第 10000 个左右。

  1. 为什么结果是一样的。
  2. 我在命令中设置了-Xss1m,是否意味着每个线程将单独拥有1m内存?如果它有单独的内存,第10000个线程将有10G内存,实际上机器中只有4G内存。

apa*_*gin 5

-Xss确定 Java 线程的最大堆栈大小。当一个线程启动时,操作系统会为这个大小的堆栈创建一个虚拟内存区域,但该内存不会立即分配到物理 RAM 中。

物理页面在第一次访问该页面的内存时被延迟分配。只要您的线程不调用深层方法,它们就不会使用所有堆栈空间。这就是为什么在 RAM 中只分配少数底部堆栈页面的原因,无论-Xss设置如何。

Linux默认启用内存过量使用。这意味着,它允许提交比物理 RAM 数量更多的虚拟内存(只要该虚拟内存实际上不受物理页面的支持,就像您的情况一样)。

因此,在您的情况下OutOfMemoryError,不是因为堆栈空间而抛出,而是由于其他操作系统限制之一:

  • ulimit -u
  • sysctl kernel.pid_max
  • sysctl kernel.threads-max

也可以看看: