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

问题描述 投票:70回答:7

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

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

java process jvm
7个回答
64
投票

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

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

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


15
投票

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


7
投票

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


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


5
投票

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


3
投票

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

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

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

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

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


2
投票

虽然这里的信息很少,但对于某些人来说这可能很有用。在Linux系统中,如果您想知道正在运行的JVM数量,可以尝试使用此命令

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

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

© www.soinside.com 2019 - 2024. All rights reserved.