Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 要使用多少内核的决定权是否掌握在JVM手中?_Java - Fatal编程技术网

Java 要使用多少内核的决定权是否掌握在JVM手中?

Java 要使用多少内核的决定权是否掌握在JVM手中?,java,Java,假设我们有一项非常复杂的任务。我知道,如果我们使用一个线程,那么实际上我们将使用一个内核,但是如果我将任务划分为等于处理器内核数量的线程,那么程序是否必须在所有内核上运行? 或者使用的线程和内核数量与JVM“决定”之间没有相关性?实际上,通常是操作系统决定Java应用程序可以使用多少内核。本机线程到内核的调度由操作系统1处理。JVM几乎没有(如果有的话)线程调度 但是,Java应用程序不一定能够访问所有核心。这将取决于系统上的其他应用程序、服务等正在做什么。事实上,操作系统可以为管理员提供外部限

假设我们有一项非常复杂的任务。我知道,如果我们使用一个线程,那么实际上我们将使用一个内核,但是如果我将任务划分为等于处理器内核数量的线程,那么程序是否必须在所有内核上运行? 或者使用的线程和内核数量与JVM“决定”之间没有相关性?

实际上,通常是操作系统决定Java应用程序可以使用多少内核。本机线程到内核的调度由操作系统1处理。JVM几乎没有(如果有的话)线程调度

但是,Java应用程序不一定能够访问所有核心。这将取决于系统上的其他应用程序、服务等正在做什么。事实上,操作系统可以为管理员提供外部限制给定(Java或非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将更多地参与管理实际完成的工作。