每个Java应用程序有一个JVM吗?

时间:2011-05-10 08:22:46

标签: java process jvm

所有运行的Java应用程序使用的JVM是相同的,或者“每个Java应用程序使用一个JVM”是否适用? (例如,应用程序是IntelliJ IDEA,例如服务器和NetBeans)

此外,分配的JVM与每个Java应用程序使用的进程之间是否存在任何连接?

8 个答案:

答案 0 :(得分:66)

一般来说,每个应用程序都将获得自己的JVM实例和自己的操作系统级进程,并且每个JVM实例都是相互独立的。

有一些实现细节,例如Class Data Sharing,其中多个JVM实例可能共享一些数据/内存,但那些对应用程序没有用户可见的影响(希望改进的启动时间除外)。

然而,常见的情况是单个应用程序服务器(或“Web服务器”),例如运行多个Web应用程序的Glassfish或Tomcat。在这种情况下,多个Web应用程序可以共享JVM。

答案 1 :(得分:15)

每个Java应用程序都有一个JVM。它们之间不应该有任何联系,除非你建立一个,例如与网络。如果您在IDE内部工作,则您编写的代码通常在单独的JVM中运行。 IDE通常会连接单独的JVM以进行调试。如果您正在处理多个Web应用程序,那么如果它们部署到同一个Web容器中,它们可以共享相同的JVM。

答案 2 :(得分:7)

运行的JVM数量是调用的可执行文件数。 每个这样的应用程序都调用它自己的java可执行文件(用于windows的java.exe / javaw.exe etx),这意味着每个应用程序都在一个单独的JVM中运行。

答案 3 :(得分:7)

理论上,您可以在JVM中运行多个应用程序。在实践中,它们可以以各种方式相互干扰。例如:

The JVM has one set of System.in/out/err, one default encoding, one default locale, one set of system properties, and so on. If one application changes these, it affects all applications.
Any application that calls System.exit() kills all applications.
If one application thread goes wild, and consumes too much CPU or memory it will affect the other applications too.

Refrence

答案 4 :(得分:5)

任何具有共享库的应用程序都将共享这些库的相同副本。 Java有相当数量的共享库。但是,除了保存一些内存之外,您不会注意到差异。

答案 5 :(得分:3)

简短回答:通常,是的,每个JVM都会获得一个应用程序。 答案很长:JVM可以这样使用,这可能是最好的选择,但不一定是。

这完全取决于您认为的“应用程序”。 IDE是一个很好的应用程序示例,它作为单个实体呈现给最终用户(即我们),但实际上由多个底层应用程序组成(编译器,测试运行器,静态分析工具,打包器,包管理器,项目/依赖管理工具等)。在这种情况下,IDE使用各种技巧来确保用户体验集成体验,同时还在某种程度上屏蔽底层工具的各个变幻莫测。其中一个技巧是在单独的JVM中执行某些事务,通过文本文件或应用程序级调试工具进行通信。

应用程序服务器(Wildfly,Glassfish,Websphere,Weblogic等)是应用程序,其存在的理由是作为其他应用程序运行的容器。在这种情况下,从一个角度来看,每个应用程序只有一个JVM(即一个JVM用于运行整个应用程序服务器)但实际上该JVM中包含多个应用程序,每个应用程序在它们自己的类加载器中在逻辑上彼此分离(减少了意外进程间串扰的可能性)。 / p>

所以,这一切都取决于你认为application的内容。如果你纯粹是在讨论“当'main()'被调用时运行的东西”,那么你每个JVM都会看一个应用程序 - 当操作系统启动JVM时,JVM会运行一个类{{1}方法。

但是,一旦您的应用程序开始变得越来越复杂,您的界限就越来越模糊诸如Intellij或Eclipse之类的IDE将重用许多与'javac'相同的东西,无论是在同一个JVM中还是在不同的JVM中,以及做不同的工作(例如重新绘制屏幕)。并且(共享JVM)应用程序服务器上的Web应用程序的用户实际上可能正在使用与通过命令行在本地使用的“核心”应用程序相同的内容。

答案 6 :(得分:2)

这里的时间不多,但这些信息可能对某些人有用。在Linux系统中,如果您想知道正在运行的JVM数量,可以尝试使用此命令

$ ps -ef | grep "[j]ava" | wc -l
  

ps列出流程,grep搜索包含“java”和wc的流程以计算返回的行数

答案 7 :(得分:0)

实际上,这是一个可能会有非常令人困惑的答案的问题。为了使它简短:

  1. 每个Java进程,每个JVM是。
  2. 运行时和ProcessBuilder遵循此规则。
  3. 使用反射加载jar,然后执行主要操作不会产生新的JVM。