【问题标题】:Why does java allocate so many processes to run a simple "hello world"?为什么java分配这么多进程来运行一个简单的“hello world”?
【发布时间】:2014-05-05 07:20:47
【问题描述】:

我正在运行这个极其简单的程序:

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

我什至怀疑指令Thread.sleep(1000),但如果将其删除,奇怪的行为不会改变。

更新

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

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

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

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

【问题讨论】:

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

标签: java jvm


【解决方案1】:

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

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

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

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

假设你看到线程...... JVM 预先创建 GC 线程的原因是当 JVM 需要它们可用时创建它们会出现问题;即当堆填满时。

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

【讨论】:

  • +1 您的 GC 理论至少部分得到了图片中 pid 的顺序性质的支持...
  • “我不认识你用来显示进程的实用程序。如果这是 top -H 输出,我会理解的......”图片的文件名,当我从缩短服务下载它时,是htop_java_helloworld.png,这是暗示...... :-)
  • All:在您自己的测试中看到这一点的简单方法是使用类似 *nix 的系统,启动程序,然后在另一个窗口中发出以下命令:top -H -c -p $(pgrep -d',' -f java)
  • 感谢您的回答。我用缺失的信息更新了问题。无论如何,我当时只运行了一个程序实例,然后我成功地杀死了它:列出的所有进程都属于正在运行的程序的同一个实例。
【解决方案2】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-09-07
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
相关资源
最近更新 更多