关于过程:每个Java应用程序是否有一个JVM?

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

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

这是一个很好的问题。 😃

一般而言,每个应用程序都会获得自己的JVM实例和自己的OS级进程,并且每个JVM实例彼此独立。

有一些实现细节,例如类数据共享,其中多个JVM实例可能共享一些数据/内存,但是这些实例对应用程序没有用户可见的影响(希望可以缩短启动时间)。

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

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

理论上,您可以在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.

运行的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应用程序的用户实际上可能使用与通过命令行在本地使用的相同的"核心"应用程序。

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

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

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

ps to list process, grep to search process containing"java" and wc to count lines returned

实际上,这是一个可能产生非常混乱答案的问题。 为了使它简短:

每个Java进程,每个JVM是。

运行时和ProcessBuilder遵循此规则。

使用反射加载jar,然后执行main不会产生新的JVM。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值