Java 要使用多少内核的决定权是否掌握在JVM手中?
假设我们有一项非常复杂的任务。我知道,如果我们使用一个线程,那么实际上我们将使用一个内核,但是如果我将任务划分为等于处理器内核数量的线程,那么程序是否必须在所有内核上运行? 或者使用的线程和内核数量与JVM“决定”之间没有相关性?实际上,通常是操作系统决定Java应用程序可以使用多少内核。本机线程到内核的调度由操作系统1处理。JVM几乎没有(如果有的话)线程调度 但是,Java应用程序不一定能够访问所有核心。这将取决于系统上的其他应用程序、服务等正在做什么。事实上,操作系统可以为管理员提供外部限制给定(Java或非Java)应用程序可能使用的内核数量的方法,或者为一个应用程序提供高于另一个应用程序的优先级Java 要使用多少内核的决定权是否掌握在JVM手中?,java,Java,假设我们有一项非常复杂的任务。我知道,如果我们使用一个线程,那么实际上我们将使用一个内核,但是如果我将任务划分为等于处理器内核数量的线程,那么程序是否必须在所有内核上运行? 或者使用的线程和内核数量与JVM“决定”之间没有相关性?实际上,通常是操作系统决定Java应用程序可以使用多少内核。本机线程到内核的调度由操作系统1处理。JVM几乎没有(如果有的话)线程调度 但是,Java应用程序不一定能够访问所有核心。这将取决于系统上的其他应用程序、服务等正在做什么。事实上,操作系统可以为管理员提供外部限
。。。或者线程数和使用的内核数之间没有相关性 有一种相关性,但不是特别有用。JVM使用的内核不会(不能)超过现有的本机线程(包括JVM的内部线程和GC线程) 还值得注意的是,操作系统(通常)不会将内核分配给当前不可运行的本机线程
Basil Bourque在该项目中指出,如果将Java线程技术纳入标准版本,它将为Java线程技术带来重大改进。然而,Loom不会改变这样一个事实,即在任何给定时间分配给应用程序JVM的物理内核的数量都是由操作系统控制/限制的
1-或操作系统的虚拟机监控程序。例如,在云计算环境中,事情可能会变得有点复杂。今天的情况确实如此,Java线程通常被实现为主机操作系统提供的本机线程。但随着为未来版本的Java开发技术的发展,情况发生了变化 ProjectLoom将虚拟线程()引入Java的并发工具箱。许多虚拟线程将映射到少数几个平台/内核线程中的每一个。当一个虚拟线程被阻塞时(等待对文件I/O、网络I/O、数据库访问等慢资源的调用),它将被“暂停”(搁置),允许其他虚拟线程在“真实”平台/内核线程上执行一段时间 这种驻车/未驻车切换速度非常快,占用内存很少(使用灵活的增长/收缩堆栈)。这使得线程变得“便宜”,便宜到一次可以运行数百万个线程 回到您的问题,这些虚拟线程的管理将在JVM中管理,而不是在主机操作系统中管理。但在我们的虚拟线程下面,我们依赖于今天使用的相同平台/内核线程,这些线程最终由主机操作系统而不是JVM控制 默认情况下,通过
Executors.newVirtualThreadExecutor
设置由虚拟线程支持的executor服务时,我们不指定要使用的平台/内核线程数。这是由JVM的实现来处理的
ProjectLowe的实验版本现在可以使用了,基于早期访问Java17。织布机团队寻求反馈。本次讨论非常有用@StephenC是的,我也试图澄清这一点。但是在虚拟线程的威胁下,JVM将更多地参与管理实际完成的工作。