首页 文章

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

提问于
浏览
1

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

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 ):

htop output showing multiple java processes

我甚至怀疑指令 Thread.sleep(1000) 但是奇怪的行为并没有被删除 .

UPDATE

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

  • 系统是Debian GNU / Linux Jessie

  • 安装的JVM来自包openjdk-7-jdk

  • 输出来自 htop ,我用 \java 过滤了它,所以只列出了有用的进程

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

我只运行一个程序实例,并且所有这些进程都被分配,当我用_2901263杀死它时,列出的所有进程都会消失,因此没有更多的程序实例同时运行 .

2 回答

  • 5

    我不清楚这些是什么 . (我不认识你用来显示进程的实用程序 . 如果这是 top -H 输出,我会理解它 . UPDATE ... htop ,很有可能 . )

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

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

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

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

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

  • 3

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

相关问题