我正在运行这个非常简单的程序:
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)
,但如果它被移除,奇怪的行为不会改变。
更新
对不起,我忘了提一些有用的细节:
htop
,我已使用\java
对其进行过滤,因此仅列出了有用的流程我使用命令javac helloWorld.java
编译了在问题开头编写的源代码,然后使用命令java helloWorld
运行它。
我只运行程序的一个实例并且分配了所有这些进程,当我用ctrl+c
杀死它时,列出的所有进程都消失了,所以没有更多的实例程序同时运行。
答案 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线程都会显示在自己的进程中。除此之外,正如其他人所指出的那样,在没有流程结束的情况下,可能还有其他与您多次运行程序相关的原因。