8

通过阅读本文,我知道每个 Java 应用程序都将运行在特定的 Java 虚拟机实例中。所以如果我执行以下命令("Java -jar test1.jar","Java -jar test2.jar",我会得到系统中的两个进程。并且如果每个命令都使用默认的堆大小,例如256M。总的内存开销是512M,对吗?还有其他问题:

  • Java虚拟机是守护进程,随系统一起启动吗?
  • 当我执行“java -jar test1.jar”时,它会创建一个Java虚拟机实例,然后执行main函数。这是否意味着每个正在运行的 Java 应用程序都是 Java 虚拟机的子线程或进程?
  • 是否每个正在运行的 java 应用程序都是独立的,其他应用程序无法从这个正在运行的 java 应用程序中获取变量、方法、常量等?
  • 如果一个正在运行的 java 应用程序崩溃,是否会影响其他正在运行的 java 应用程序?

PS:我google了一下,得到了很多不同的答案,我完全糊涂了。任何可以帮助我解决此类问题甚至更深入的Java虚拟机的人。例如,它是如何工作的。

4

3 回答 3

7

JVM 是一个标准进程,就像任何其他进程一样。因此,两者之间没有隐含的通信或状态共享。每个都有自己的堆、线程等。如果你杀死一个,它不会影响另一个。

共享的是JVM 本身的代码页。内核足够智能,可以识别运行两次的相同二进制文件(任何二进制文件,而不仅仅是 JVM)并重用映像。这仅适用于实际的二进制代码 - 而不是它的状态。请参阅此处了解更多信息。Linux。

JVM 不是守护进程,但可以在系统启动时作为 Windows 服务或 Unix/Linux 进程(通过/etc/init.d脚本)启动。这就是您(比如说)在机器启动时运行用 Java 编写的 Web 服务的方式。

于 2012-09-20T08:45:47.893 回答
2

1) 不,但是有一种方法可以将 java 应用程序作为带有包装器的服务启动(谷歌表示“Java 服务”)。

2) 是的。

3)您可以使用进程之间的通信(vg HTTP)。但是由于所有进程都在 JVM 中运行,因此没有捷径可走。

4) 没有

于 2012-09-20T08:40:40.143 回答
0

For the OS, JVM like an user application. Each JVM Instance is individual.

  1. 不。JVM和其他进程一样是正常进程。但是你可以将它作为守护进程运行。
  2. 是的。Java 应用程序在 JVM 上运行,就像您在操作系统上的应用程序一样。
  3. 是的。每个 JVM 线程都是独立的,但它们可以通过网络与其他 JVM 通信,RMI ...
  4. 这取决于。通常它们是单独的,但如果 JVM 崩溃cause the OS crash,其他 JVM 将受到影响。
于 2012-09-20T13:18:34.517 回答