Java 为什么我的单线程hello world应用程序使用22个OS线程?

Java 为什么我的单线程hello world应用程序使用22个OS线程?,java,jvm,Java,Jvm,出于好奇,我写了Hello World,并在我的打印声明上设置了一个断点 public class Program { public static void main(String[] args) { System.out.println("Hello"); } } 当到达断点时,我在windows中调出任务管理器,查看JVM进程分配了多少线程。看到22岁,我很震惊。为什么这个简单的程序会产生这么多线程 JVM利用一些守护进程线程(例如垃圾收集器、终结器

出于好奇,我写了Hello World,并在我的打印声明上设置了一个断点

public class Program
{
    public static void main(String[] args)
    {
        System.out.println("Hello");
    }
}

当到达断点时,我在windows中调出任务管理器,查看JVM进程分配了多少线程。看到22岁,我很震惊。为什么这个简单的程序会产生这么多线程

JVM利用一些守护进程线程(例如垃圾收集器、终结器等)。但是,在本例中,附加调试器实际上创建了几个线程来处理调试器连接。

如上所述,有许多守护进程线程总是由JVM运行。要查看当前运行的所有线程,请在
JDK-->bin
文件夹中打开
Java VisualVM
,然后转到线程。在那里,您可以看到所有正在运行、睡眠、等待和监视线程


目前,在我的
VisualVM
中,我有
19
个活动线程,其中
15
是守护进程线程。

另外,仅供参考,刚刚发现JVM将至少为GC分配n个线程,其中n是核心数。来源:。这就解释了我的第8个问题。

也有很多执事线索。就像GC是他们中的一员。你停下来看看他们的名字了吗?它们通常是非常描述性的,有时甚至是不言自明的。不要忘记调试器占用了大量线程。如果你打开了JMX,会有更多的东西。可能取决于你的JVM实现,但是还有很多事情需要做。JVM需要的一个简短的清单包括垃圾收集线程、I/O线程、类加载线程、处理操作系统调用的线程等。当考虑到有多少事情发生时,22实际上看起来是一个低的数字。一个线程变得孤独和害怕,不得不独自面对整个世界。其他的都是为了道义上的支持。austin给出了一个非常好的关注列表,其中有专门的线程。您刚刚发现Java的巨大开销。祝贺你。@MarkoTopolnik我猜是5-6。我很惊讶地看到超过20只。@sevenbitsjavahogs内存,但我没有听到太多关于内存短缺的抱怨。另一方面,它非常小心CPU时间开销——这就是所有人的眼睛所在。