我对“织机计划”很感兴趣,但有一件事我不能完全理解。
大多数Java服务器使用的线程池都有一定的线程限制(200,300 .),但是,您不会受到操作系统的限制而产生更多的线程池,我已经了解到,对于Linux的特殊配置,您可以达到巨大的数量。
OS线程更昂贵,启动/停止速度更慢,必须处理上下文切换(被它们的数量放大),并且您依赖于操作系统,它可能拒绝为您提供更多的线程。
话虽如此,虚拟线程也消耗了类似数量的内存(至少这是我所理解的)。有了织机,我们可以得到尾部调用优化,这将减少内存的使用。此外,同步和线程上下文复制仍然是一个类似大小的问题。
事实上,你能够产生数百万的虚拟线程
public static void main(String[] args) {
for (int i = 0; i < 1_000_000; i++) {
Thread.startVirtualThread(() -> {
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
});
}
}当我使用平台线程时,上面的代码在25k左右中断,OOM异常。
我的问题是,究竟是什么使这些线程变得如此轻,是什么阻止我们生成100万个平台线程并与它们一起工作,仅仅是上下文切换使常规线程变得如此“沉重”。
一个非常相似的问题
到目前为止我发现的东西:
发布于 2022-09-08 16:23:52
coroutines (所以是虚拟线程)的一个巨大优点是,它们可以生成高级别的并发性,而无需回调的缺点。
首先让我介绍一下利特尔定律:
concurrency = arrival_rate * latency我们可以把这个改写成:
arrival_rate = concurrency/latency在稳定的系统中,到达率等于吞吐量。
throughput = concurrency/latency要提高吞吐量,您有两个选项:
对于常规线程,由于上下文切换开销,阻塞调用很难达到高度并发性。在某些情况下,可以异步发出请求(例如NIO + Epoll或Netty io_uring绑定),但是您需要处理回调和回调地狱。
使用虚拟线程,可以异步发出请求,并将虚拟线程停放并调度另一个虚拟线程。一旦接收到响应,虚拟线程就会被重新安排,这将完全透明地完成。编程模型比使用经典线程和回调要直观得多。
发布于 2022-09-27 07:34:55
虚拟线程封装在平台线程上,因此您可能会认为它们是JVM提供的错觉,整个想法是将线程的生命周期设置为 CPU界 操作。
究竟是什么让Java虚拟线程更好呢?
虚拟线程优势
虚拟线程使用注意事项
第四层架构有更好的理解.

CPU
操作系统
JVM
带有可执行服务的虚拟线程
查找有关杰普-425的更多信息
发布于 2022-10-06 10:32:30
有时,人们不得不构建能够同时处理大量客户端的系统。由于RAM消耗和上下文切换成本,本机线程无法满足这一要求。
虚拟线程使我们能够同时运行数以百万计的I/O绑定任务,而无需改变我们的心智模型。
这就是戈朗进入这个行业的原因(除了谷歌的支持)。Goroutines是一个非常类似于Java虚拟线程的概念,它们解决了同样的问题。
还有其他方法来实现虚拟线程所做的事情(例如NIO和相关的反应堆模式)。然而,这就需要使用消息循环和回调来扭曲您的思维(这就是为什么这么多人讨厌JavaScript)。在它们上面有几层抽象,使事情变得简单一些,但它们也有代价。
https://stackoverflow.com/questions/72116652
复制相似问题