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

irlmq6kh  于 8个月前  发布在  Java
关注(0)|答案(8)|浏览(184)

所有运行的Java应用程序都使用相同的JVM吗?或者,“每个Java应用程序一个JVM”适用吗?(假设应用程序是IntelliJ IDEA,例如服务器和NetBeans)
此外,在分配的JVM和每个Java应用程序使用的进程之间是否有任何联系?

jqjz2hbq

jqjz2hbq1#

一般来说,每个应用程序都有自己的JVM示例和自己的操作系统级进程,每个JVM示例都是相互独立的。
有一些实现细节,如Class Data Sharing,其中多个JVM示例可能共享一些数据/内存,但这些对应用程序没有用户可见的影响(除了改进启动时间,希望如此)。
然而,一个常见的场景是单个应用服务器(或“Web服务器”),例如运行多个Web应用程序的Glassfish或Tomcat。在这种情况下,多个Web应用程序可以共享JVM。然而,随着容器化和微服务的发展,这种设置已经变得不那么常见了。

f4t66c6m

f4t66c6m2#

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

mf98qq94

mf98qq943#

理论上,你可以在一个JVM中运行多个应用程序。在实践中,它们可以以各种方式相互干扰。For example

  • JVM有一组System.in/out/err、一个默认编码、一个默认区域设置、一组系统属性,等等。如果一个应用程序更改了这些,它会影响所有应用程序。
  • 任何调用System.exit()的应用程序都会杀死所有应用程序。
  • 如果一个应用程序线程失控,消耗过多的CPU或内存,它也会影响其他应用程序。
uujelgoq

uujelgoq4#

简短回答:通常,每个JVM都有一个应用程序。长回答:JVM可以这样使用,这可能是最好的选择,但也不是必须这样。
这一切都取决于你认为什么是“应用程序”。IDE是应用程序的一个很好的例子,它被呈现给它的最终用户(即,us)作为单个实体,但实际上由多个底层应用程序(编译器、测试运行器、静态分析工具、打包器、包管理器、项目/依赖管理工具等)组成。在这种情况下,IDE会使用各种技巧来确保用户体验到集成的体验,同时(在某种程度上)也不会受到底层工具的单独影响。其中一个技巧是在一个单独的JVM中做一些事情,通过文本文件或应用程序级调试工具进行通信。
应用服务器(Wildfly、Glassfish、Websphere、Weblogic等)是应用程序,其存在的理由是充当其他应用程序运行的容器。在这种情况下,从一个Angular 来看,每个应用程序都有一个JVM(即,一个JVM用于运行整个应用程序服务器),但实际上该JVM中包含多个应用程序,每个应用程序都在自己的类加载器中相互逻辑分离(减少了意外进程内串扰的可能性)。
所以,这一切都取决于你认为application是什么。如果你纯粹是在谈论“当'main()'被调用时运行的东西”,那么你正在看每个JVM的一个应用程序-当操作系统启动JVM时,JVM运行单个类的public static void main()方法。
但是,一旦你的应用程序开始变得越来越复杂,你的界限就会变得更加模糊。像Intellij或Eclipse这样的IDE将重用与“javac”相同的东西,无论是在同一个JVM中还是在不同的JVM中,以及做不同的工作(比如重新绘制屏幕)。在(共享JVM)应用服务器上的Web应用程序的用户实际上可能正在使用与通过命令行本地使用的“核心”应用程序几乎相同的应用程序。

bnl4lu3b

bnl4lu3b5#

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

cwtwac6a

cwtwac6a6#

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

sd2nnvve

sd2nnvve7#

有点晚了,但是这个信息可能对某人有用。在Linux系统中,如果您想知道有多少JVM正在运行,可以尝试以下命令

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

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

roqulrg3

roqulrg38#

事实上,这是一个可能有非常混乱的答案的问题。简单说真实的:
1.是的,每个Java进程,每个JVM。

  1. Linux和ProcessBuilder遵循此规则。
    1.使用反射加载jar,然后执行main不会产生新的JVM。

相关问题