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

标签 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 杀死它时列出的所有进程都消失了,所以没有' t 个程序的更多实例同时运行。

最佳答案

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

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

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

Why does java allocate so many processes to run a simple “hello world”?

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

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

关于java - 为什么 java 分配这么多进程来运行一个简单的 "hello world"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23466950/

相关文章:

java - JSP : JSTL's <c:out> tag

java - 什么是 Java 类的签名者?

java - JDK 8 中的 PermGen 消除

java - java中的C2 CompilerThread

java - 无法加载 JVM

java - 如何组合并返回枚举值

java - 线程在 Java 中永不停止

java - 是否可以更改标准 jsr-353 api 使用的提供程序?

haskell - Haskell 中的并发编程

java - 当不再需要时,JVM 是否会将空闲内存返还给操作系统?