Java 为什么VisualVM本身运行50个线程? 更新

Java 为什么VisualVM本身运行50个线程? 更新,java,multithreading,visualvm,Java,Multithreading,Visualvm,问这个问题的另一种方式是“应用程序的可用线程是否比内核多?” 原始问题 我的笔记本电脑总共有8个内核。我刚刚下载了最新版本的VisualVM,并点击了VisualVM选项卡查看它的性能。我注意到的一点是,它使用32个活动线程和22个守护进程线程。为什么要用这么多?IIUC使用8个以上的线程效率较低,而且IIUC JVM知道我有多少个内核,所以它可以将线程总数限制为8个 有人将此标记为副本,因此我将尝试以稍微不同的方式解释我的问题。我不是问如何使用VisualVM的特定功能。我在问为什么它会运行超

问这个问题的另一种方式是“应用程序的可用线程是否比内核多?”

原始问题 我的笔记本电脑总共有8个内核。我刚刚下载了最新版本的VisualVM,并点击了
VisualVM
选项卡查看它的性能。我注意到的一点是,它使用32个活动线程和22个守护进程线程。为什么要用这么多?IIUC使用8个以上的线程效率较低,而且IIUC JVM知道我有多少个内核,所以它可以将线程总数限制为8个


有人将此标记为副本,因此我将尝试以稍微不同的方式解释我的问题。我不是问如何使用VisualVM的特定功能。我在问为什么它会运行超过8个线程,因为IIUC超过8个线程会不够理想,而VisualVM来自Oracle,所以我想他们会将其设计为最佳功能,所以我想知道我是否遗漏了一些东西,或者Oracle只是允许它运行的线程数超过它应该运行的线程数?

仅仅因为有50个VisualVM线程在运行,这并不一定意味着所有这些线程都应该同时工作。如果您在“Running”列上排序,您将看到只有前7个或8个线程正在积极运行。其余线程正在休眠或等待I/O。

可能重复“Profiled threads limit..always 32”一个说明额外线程正在做什么的答案更有用:“waiting for I/O”你的答案是有道理的,但根据我目前对并发java解决方案应该如何设计的理解,对我来说,这仍然是一个设计缺陷。自从甲骨文制造了这个,我想知道他们是否知道一些我不知道的事情。我特别想知道,为什么他们不在整个应用程序中使用最多8个线程的共享执行器池?这样做有什么好处吗?线程数超过内核数没有什么错。事实上,这是一种标准做法,不仅仅是Oracle。正如我所说,其优点是,当一个CPU内核空闲时,因为该线程当前正在等待I/O或其他东西,它仍然可以处理另一个线程,而不是闲置。这种逻辑是有道理的。例如,如果我们正在发出一百个异步rest请求并等待缓慢的响应,那么我们最好为每个请求指定一个异步线程,并并行处理所有请求。其中一个线程正在忙于计算斐波那契数,而另一个线程正在等待同样在同一台机器上执行的数据库操作。在这种情况下,数据库可能会使用另一个核心,因此在这种情况下,例如有4个线程可能会导致过度的上下文切换,因此最终似乎这是需要调整的东西。。。?