在无限循环中创建线程
Creating threads in infiinite loop
我的理解是每个新线程为其栈分配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 的虚拟地址 space,但只有最少量的实际内存分配给每个堆栈,直到它实际用过的。 64Kb,通常在 Windows 上。阅读操作系统进程内存分配 - 特别是 allocated(aka reserved)虚拟地址 space 和提交 内存在另一个。
以下描述可能有所帮助:Reserving and Committing Memory (MSDN)
我的理解是每个新线程为其栈分配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 的虚拟地址 space,但只有最少量的实际内存分配给每个堆栈,直到它实际用过的。 64Kb,通常在 Windows 上。阅读操作系统进程内存分配 - 特别是 allocated(aka reserved)虚拟地址 space 和提交 内存在另一个。
以下描述可能有所帮助:Reserving and Committing Memory (MSDN)