【问题标题】:Creating threads in infiinite loop在无限循环中创建线程
【发布时间】:2018-03-16 19:59:21
【问题描述】:

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

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

相反,我的小虚拟应用程序创建了数千个线程,但内存消耗远低于预期(基于 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();
    }
}

【问题讨论】:

  • 我的理解是每个新线程都会为其堆栈分配 1MB 的内存。你是从哪里得到这个理解的?
  • @shmosel stackoverflow.com/a/4619501/6051176这个答案下面有评论

标签: java multithreading memory out-of-memory


【解决方案1】:

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

这里有一个可能有帮助的描述:Reserving and Committing Memory (MSDN)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2021-02-20
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多