是运行所有Java应用程序使用的JVM,还是"每个Java应用程序一个JVM"适用?(例如,应用程序是IntelliJ IDEA,例如服务器和NetBeans)
此外,分配的JVM与每个Java应用程序使用的进程之间是否存在任何连接?
Whi*_*g34 18
每个Java应用程序都有一个JVM.它们之间不应该有任何联系,除非你建立一个,例如与网络.如果您在IDE内部工作,则您编写的代码通常在单独的JVM中运行.IDE通常会连接单独的JVM以进行调试.如果您正在处理多个Web应用程序,则如果它们部署到同一Web容器,则它们可以共享相同的JVM.
运行的JVM数是调用的可执行文件数.每个这样的应用程序都调用它自己的java可执行文件(用于windows的java.exe/javaw.exe etx),这意味着每个应用程序都在一个单独的JVM中运行.
简短的答案:通常,是的,每个JVM您将获得一个应用程序。长答案:JVM可以这样使用,这可能是最好的选择,但并非必须如此。
这完全取决于您认为什么是“应用程序”。IDE是一个应用程序的好例子,它作为一个实体呈现给最终用户(即我们),但实际上由多个基础应用程序(编译器,测试运行器,静态分析工具,打包器,包管理器,项目/依赖管理工具等)。在那种情况下,IDE可使用多种技巧来确保用户体验到集成的体验,同时(在某种程度上)不受底层工具的各种变化的影响。一种这样的技巧是在单独的JVM中做一些事情,通过文本文件或通过应用程序级调试工具进行通信。
应用服务器(Wildfly,Glassfish,Websphere,Weblogic等)是应用程序,其存在的理由是充当其他应用程序在其中运行的容器。在这种情况下,从一个角度来看,每个应用程序只有一个JVM(即一个JVM)用于运行整个应用程序服务器),但实际上该JVM本身包含多个应用程序,每个应用程序在各自的类加载器中在逻辑上彼此分离(减少了意外进程内串扰的可能性)。
因此,这实际上取决于您认为是什么application。如果您纯粹是在谈论“调用'main()'时将运行的事物”,那么您正在针对每个JVM查看一个应用程序-当操作系统启动JVM时,JVM将运行单个类的public static void main()方法。
但是,一旦您的应用程序开始变得更加复杂,您的界限就会变得更加模糊。诸如Intellij或Eclipse之类的IDE将在相同的JVM或不同的JVM中重用许多与“ javac”相同的东西,并进行不同的工作(例如重新绘制屏幕)。而且,(共享JVM)应用程序服务器上的Web应用程序的用户实际上可能使用与通过命令行在本地使用的相同的“核心”应用程序。