在infiinite循环中创建线程

时间:2018-03-16 19:59:21

标签: java multithreading memory out-of-memory

我的理解是每个新线程为其堆栈分配1MB内存。

我希望如果我在无限循环中创建线程,那么很快就会耗尽内存,当我检查java进程的内存消耗时,我会看到4000内存占用的4GB内存线程。

相反,我的小虚拟应用程序创建了数千个线程,但内存消耗低于预期(基于Windows任务管理器为4000线程的~250MB,并且使用的系统内存也远低于预期)。有人可以解释为什么会这样吗?

public static void main(String[] args) {
    int i = 1;
    while (true) {
        new Thread(() -> waitForMillis(6000000)).start();
        System.out.println(i++);
        waitForMillis(100);
    }
}

private static void waitForMillis(int millis) {
    try {
        Thread.sleep(millis);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:2)

您为每个堆栈使用了 1Mb 的虚拟地址空间,但在实际使用之前,每个堆栈只分配了最少量的实际内存。 64Kb ,通常在Windows上。阅读操作系统进程内存分配 - 特别是已分配(又名保留)虚拟地址空间与已提交内存之间的区别另一个。

以下是可能有用的一条说明:Reserving and Committing Memory (MSDN)