我正在运行这个极其简单的程序:
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
杀死它时列出的所有进程都消失了,所以没有' 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/