为什么 Java 21 虚拟线程比平台线程需要更少的内存?

问题描述 投票:0回答:2

我确实知道平台线程很昂贵,因为它需要更多内存并且容易发生 CPU 上下文切换。

但是,在虚拟线程的情况下,少数平台线程可以服务难以想象的大量虚拟线程,虚拟线程是否仍然需要内存空间来钝化上下文/堆栈,然后将其附加到载体线程?

它对记忆有何影响?

为什么旋转 10000 个虚拟线程不会因内存不足而消亡,而 10000 个平台线程却会?

两者都需要相同的堆栈吗?以及需要维护应用程序相关信息的上下文,对吧?

内存中是否存在仅适用于平台线程的额外开销,这就是我们说虚拟线程在内存中“更轻”的原因?如果是的话,是什么造成了这种差异?

java multithreading java-21 project-loom virtual-threads
2个回答
5
投票

两者都需要相同的堆栈。

不正确。事实上,这可能是虚拟线程的主要“胜利”。

平台线程的调用堆栈必须始终包含在专用的连续虚拟内存块中——通常约为 1 MB,但如果需要,您可以指定更大的值。这就是它在每个操作系统上的工作原理。自从“调用堆栈”的想法被发明以来,它一直都是这样工作的。

如果您没有进行仔细的分析来确定每个线程真正需要多少内存来在最深的调用中保存其堆栈,那么您可能会过度分配,只是为了“安全起见”。也许您过度分配了几个数量级。当然,这只是“虚拟”内存,因此如果您的程序只有几个线程,没有问题。但是,如果您想要拥有数千虚拟线程,...突然,问题。 我实际上并不

知道

java虚拟线程的调用堆栈是如何实现的,但我知道它不是在每个线程的单个连续分配中。*因此,在任何给定时刻,没有虚拟线程线程为其堆栈保留的内存多于其实际需要的内存。 *如果我要实现它,我想我会把它保存在堆分配对象的链接列表中。也许每个激活记录都是它自己的对象,有一个

next

字段指向调用者的激活记录。或者,如果将其分配为更大的“块”,可能会更有效。在我尝试之前我不会知道。

    


0
投票
内存中是否有任何额外的开销仅适用于平台线程

是的。非常大的数量:兆字节与千字节,甚至那么多。

这就是为什么虚拟线程相比之下被认为非常便宜。

© www.soinside.com 2019 - 2024. All rights reserved.