所有运行的Java应用程序都使用相同的JVM吗?或者,“每个Java应用程序一个JVM”适用吗?(假设应用程序是IntelliJ IDEA,例如服务器和NetBeans)此外,在分配的JVM和每个Java应用程序使用的进程之间是否有任何联系?
jqjz2hbq1#
一般来说,每个应用程序都有自己的JVM示例和自己的操作系统级进程,每个JVM示例都是相互独立的。有一些实现细节,如Class Data Sharing,其中多个JVM示例可能共享一些数据/内存,但这些对应用程序没有用户可见的影响(除了改进启动时间,希望如此)。然而,一个常见的场景是单个应用服务器(或“Web服务器”),例如运行多个Web应用程序的Glassfish或Tomcat。在这种情况下,多个Web应用程序可以共享JVM。然而,随着容器化和微服务的发展,这种设置已经变得不那么常见了。
f4t66c6m2#
每个Java应用程序都有一个JVM。他们之间不应该有任何联系,除非你建立一个,例如。与网络。如果您在IDE中工作,那么您编写的代码通常在单独的JVM中运行。IDE通常会连接单独的JVM进行调试。如果你正在处理多个Web应用程序,如果它们被部署到同一个Web容器中,它们可以共享同一个JVM。
mf98qq943#
理论上,你可以在一个JVM中运行多个应用程序。在实践中,它们可以以各种方式相互干扰。For example:
System.in
out
err
System.exit()
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应用程序的用户实际上可能正在使用与通过命令行本地使用的“核心”应用程序几乎相同的应用程序。
application
public static void main()
bnl4lu3b5#
运行的JVM数是调用的可执行文件数。每个这样的应用程序调用它自己的java可执行文件(java. exe/javaw.exe etx for windows),这意味着每个应用程序都在一个单独的JVM中运行。
cwtwac6a6#
任何具有共享库的应用程序都将共享这些库的相同副本。Java有很多共享库。但是,除了节省了一些内存之外,您不会注意到任何差异。
sd2nnvve7#
有点晚了,但是这个信息可能对某人有用。在Linux系统中,如果您想知道有多少JVM正在运行,可以尝试以下命令
$ ps -ef | grep "[j]ava" | wc -l
ps用于列出进程,grep用于搜索包含“java”的进程,wc用于计算返回的行数
ps
grep
wc
roqulrg38#
事实上,这是一个可能有非常混乱的答案的问题。简单说真实的:1.是的,每个Java进程,每个JVM。
8条答案
按热度按时间jqjz2hbq1#
一般来说,每个应用程序都有自己的JVM示例和自己的操作系统级进程,每个JVM示例都是相互独立的。
有一些实现细节,如Class Data Sharing,其中多个JVM示例可能共享一些数据/内存,但这些对应用程序没有用户可见的影响(除了改进启动时间,希望如此)。
然而,一个常见的场景是单个应用服务器(或“Web服务器”),例如运行多个Web应用程序的Glassfish或Tomcat。在这种情况下,多个Web应用程序可以共享JVM。然而,随着容器化和微服务的发展,这种设置已经变得不那么常见了。
f4t66c6m2#
每个Java应用程序都有一个JVM。他们之间不应该有任何联系,除非你建立一个,例如。与网络。如果您在IDE中工作,那么您编写的代码通常在单独的JVM中运行。IDE通常会连接单独的JVM进行调试。如果你正在处理多个Web应用程序,如果它们被部署到同一个Web容器中,它们可以共享同一个JVM。
mf98qq943#
理论上,你可以在一个JVM中运行多个应用程序。在实践中,它们可以以各种方式相互干扰。For example:
System.in
/out
/err
、一个默认编码、一个默认区域设置、一组系统属性,等等。如果一个应用程序更改了这些,它会影响所有应用程序。System.exit()
的应用程序都会杀死所有应用程序。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应用程序的用户实际上可能正在使用与通过命令行本地使用的“核心”应用程序几乎相同的应用程序。
bnl4lu3b5#
运行的JVM数是调用的可执行文件数。每个这样的应用程序调用它自己的java可执行文件(java. exe/javaw.exe etx for windows),这意味着每个应用程序都在一个单独的JVM中运行。
cwtwac6a6#
任何具有共享库的应用程序都将共享这些库的相同副本。Java有很多共享库。但是,除了节省了一些内存之外,您不会注意到任何差异。
sd2nnvve7#
有点晚了,但是这个信息可能对某人有用。在Linux系统中,如果您想知道有多少JVM正在运行,可以尝试以下命令
ps
用于列出进程,grep
用于搜索包含“java”的进程,wc
用于计算返回的行数roqulrg38#
事实上,这是一个可能有非常混乱的答案的问题。简单说真实的:
1.是的,每个Java进程,每个JVM。
1.使用反射加载jar,然后执行main不会产生新的JVM。