我正在运行这个非常简单的程序:
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)
但是奇怪的行为并没有被删除 .
UPDATE
对不起,我忘了提一些有用的细节:
-
系统是Debian GNU / Linux Jessie
-
安装的JVM来自包openjdk-7-jdk
-
输出来自
htop
,我用\java
过滤了它,所以只列出了有用的进程
我使用命令 javac helloWorld.java
编译了在问题开头编写的源代码,然后使用命令 java helloWorld
运行它 .
我只运行一个程序实例,并且所有这些进程都被分配,当我用_2901263杀死它时,列出的所有进程都会消失,因此没有更多的程序实例同时运行 .
2 回答
我不清楚这些是什么 . (我不认识你用来显示进程的实用程序 . 如果这是
top -H
输出,我会理解它 . UPDATE ...htop
,很有可能 . )一种可能性是你已经多次运行应用程序......没有杀死旧的应用程序......而且你正在看到所有的进程 .
另一种可能性是你看到线程不是进程 . 在Linux上,每个本机线程都有自己唯一的PID . 传统上,会创建3个线程,一个用于运行应用程序,另一个用于垃圾收集器和终结器 . 但在您的情况下,JVM可能已经创建了多个GC线程...用于并行垃圾收集 .
假设您正在看线程... JVM预创建GC线程的原因是,当JVM需要它们时,创建它们会有问题;即当堆填满时 .
(JVM针对运行大型,长期运行的应用程序进行了优化,而不是像“hello world”那样的简单应用程序 . 众所周知,Oracle JVM不适合运行小型短期应用程序,因为JVM启动开销,堆使用率和等等 . )
实际原因是在Linux中实现了系统线程库 . 从概念上讲,单个主程序运行会导致单个进程中的线程很少(垃圾收集器等) . 但是,Linux线程是作为克隆进程实现的,因此每个java线程都会显示在自己的进程中 . 除此之外,正如其他人所指出的那样,在没有流程结束的情况下,可能还有其他与您多次运行程序相关的原因 .