为什么java分配这么多进程来运行一个简单的;“你好,世界”吗;?

为什么java分配这么多进程来运行一个简单的;“你好,世界”吗;?,java,jvm,Java,Jvm,我正在运行一个非常简单的程序: class helloWorld { public static void main(String[] args) throws InterruptedException { while(true) { System.out.println("Hello World!"); Thread.sleep(1000); } } } 我不明白为什么java虚拟机分配这么多进程(它们有不同的PID)

我正在运行一个非常简单的程序:

class helloWorld {
    public static void main(String[] args) throws InterruptedException {

    while(true) {
        System.out.println("Hello World!");
        Thread.sleep(1000);
        }
    }
}
我不明白为什么java虚拟机分配这么多进程(它们有不同的PID),你可以在这里看到(
htop\u java\u helloworld.png
):

htop显示多个java进程的输出“>

我甚至怀疑Thread.sleep(1000)指令有问题,但是如果删除它,奇怪的行为不会改变

更新

很抱歉,我忘了提到一些有用的细节:

  • 系统是Debian GNU/Linux Jessie
  • 安装的JVM来自openjdk-7-jdk包
  • 输出来自
    htop
    ,我用
    \java
    对其进行了过滤,因此只列出了有用的流程
我用命令
javac helloWorld.java
编译了问题开头编写的源代码,然后用命令
javahelloworld
运行它


我只运行程序的一个实例,并且分配了所有这些进程,当我使用
ctrl+c
终止它时,列出的所有进程都消失了,因此不会有更多的程序实例同时运行。

我不清楚这些是什么。(我不知道您用于显示进程的实用程序。如果这是
top-H
输出,我会理解它。最有可能的情况是更新
htop

一种可能性是,您已经多次运行该应用程序…而没有杀死旧的应用程序…并且您看到了所有的进程

另一种可能性是,您看到的是线程而不是进程。在Linux上,每个本机线程都有自己独特的PID。通常,会创建3个线程,一个用于运行应用程序,一个用于垃圾收集器和终结器。但在您的情况下,JVM可能会创建多个GC线程…用于并行垃圾收集

为什么java分配这么多进程来运行一个简单的“hello world”

假设您看到的是线程……JVM预创建GC线程的原因是,当JVM需要它们可用时,即当堆填满时,创建它们会有问题


(JVM是为运行大型、长期运行的应用程序而优化的,而不是像“hello world”这样的琐碎应用程序。众所周知,Oracle JVM不适合运行小型短期应用程序,因为JVM启动开销、堆使用等。)

我不清楚这些是什么。(我不知道您用于显示进程的实用程序。如果这是
top-H
输出,我会理解它。最有可能的情况是更新
htop

一种可能性是,您已经多次运行该应用程序…而没有杀死旧的应用程序…并且您看到了所有的进程

另一种可能性是,您看到的是线程而不是进程。在Linux上,每个本机线程都有自己独特的PID。通常,会创建3个线程,一个用于运行应用程序,一个用于垃圾收集器和终结器。但在您的情况下,JVM可能会创建多个GC线程…用于并行垃圾收集

为什么java分配这么多进程来运行一个简单的“hello world”

假设您看到的是线程……JVM预创建GC线程的原因是,当JVM需要它们可用时,即当堆填满时,创建它们会有问题


(JVM是为运行大型、长期运行的应用程序而优化的,而不是像“hello world”这样的琐碎应用程序。众所周知,Oracle JVM不适合运行小型短期应用程序,因为JVM启动开销、堆使用等。)

实际原因是在Linux中实现了系统线程库。
从概念上讲,一个主程序的运行只会导致一个进程只有很少的线程(垃圾收集器等)但是Linux线程是作为克隆进程实现的,因此每个java线程都会出现在自己的进程中。除此之外,正如其他人所指出的,可能还有其他原因与您多次运行程序而不结束进程有关。

实际原因是系统线程的实现Linux中的s库。
从概念上讲,一个主程序的运行只会导致一个进程只有很少的线程(垃圾收集器等)但是Linux线程是作为克隆进程实现的,因此每个java线程都会出现在自己的进程中。除此之外,正如其他人所指出的,可能还有其他原因与您多次运行程序而不结束进程有关。

您的操作系统是这样吗?真的很酷。.我不明白这种行为。您正在运行吗在不杀死它的情况下多次显示(因为程序永远不会死)?然后无论你运行了多少次它都会显示。如果你显示一个程序的输出,说出该程序是什么。现在,我们必须从你链接到的图片的文件名猜出它是
htop
。非常脆弱……所有:你可能会想发布一个答案(正如我所做的)说“我没有得到那个结果”——在你这样做之前,确保你使用的是一个类似*nix的系统,并用以下命令检查:
top-H-c-p$(pgrep-d','-f java)
然后看看Stephen c的答案::-)@所有我更新的问题,我很抱歉在原始版本中丢失了详细信息。你是操作系统吗?真的很酷。我不明白那种行为。你是否多次运行它而不杀死它(因为程序永远不会死)?然后无论你运行多少次它都会显示出来。如果你显示一个程序的输出,说出该程序是什么。现在,我们必须从你链接的图片的文件名猜出它是
htop
。非常脆弱……所有:你可能会想发布一个答案(如下所示)