java - 在无限循环中创建线程

标签 java multithreading memory out-of-memory

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

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

相反,我的小虚拟应用程序创建了数千个线程,但内存消耗远低于预期(基于 4000 个线程的 Windows 任务管理器,约 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 虚拟地址空间,但在实际使用之前,只为每个堆栈分配最少量的实际内存。 64Kb,通常在 Windows 上。了解操作系统进程内存分配 - 特别是一方面分配(又名保留)虚拟地址空间与提交内存之间的区别另一个。

以下描述可能会有所帮助:Reserving and Committing Memory (MSDN)

关于java - 在无限循环中创建线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49328635/

相关文章:

java - javac 和 Eclipse 编译器有什么区别?

java - 如何清理tomcat缓存?

Python:多线程设置一次变量

java - 将 wait 和 notifyAll 代码转换为使用 Java 1.5 Lock 对象

java - sleep 时线程中断

java - 如何在按钮下的 JFrame 中创建一个计数器?

c++ - C++11 中的生产者-消费者

python加入 "large"文件

python - 在Python中使用静态地址和偏移量从进程读取内存地址

c++ - 如何在 C++ 类中初始化 char *? (sizeof() 总是给出 8)