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

时间:2014-05-05 07:20:48

标签: java jvm

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

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

    while(true) {
        System.out.println("Hello World!");
        Thread.sleep(1000);
        }
    }
}

我不明白为什么java虚拟机会分配这么多进程(它们有不同的 PID ),你能在这里看到(htop_java_helloworld.png):

<code>htop</code> output showing multiple java processes

我甚至怀疑指令Thread.sleep(1000),但如果它被移除,奇怪的行为不会改变。

更新

对不起,我忘了提一些有用的细节:

  • 系统是Debian GNU / Linux Jessie
  • 安装的JVM来自包openjdk-7-jdk
  • 输出来自htop,我已使用\java对其进行过滤,因此仅列出了有用的流程

我使用命令javac helloWorld.java编译了在问题开头编写的源代码,然后使用命令java helloWorld运行它。

我只运行程序的一个实例并且分配了所有这些进程,当我用ctrl+c杀死它时,列出的所有进程都消失了,所以没有更多的实例程序同时运行。

2 个答案:

答案 0 :(得分:5)

我不清楚这些是什么。 (我无法识别您用于显示流程的实用程序。如果这是top -H输出,我就会理解。更新 ... htop,最有可能的。)

一种可能性是你多次运行应用程序......没有杀死旧的应用程序......而且你看到了所有的进程。

另一种可能性是你看到线程不是进程。在Linux上,每个本机线程都有自己唯一的PID。传统上,会创建3个线程,一个用于运行应用程序,另一个用于垃圾收集器和终结器。但在您的情况下,JVM可能已经创建了多个GC线程......用于并行垃圾收集。

  

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

假设您正在看线程... JVM预创建GC线程的原因是,当JVM需要它们时,创建它们会有问题;即当堆填满时。

(JVM针对运行大型,长期运行的应用程序进行了优化,而不是像“hello world”那样的简单应用程序。众所周知,由于JVM启动开销,Oracle JVM不适合运行小型短期应用程序,堆使用等等。)

答案 1 :(得分:3)

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