每个Java应用程序是否有一个JVM?

每个Java应用程序是否有一个JVM?,java,process,jvm,Java,Process,Jvm,是否所有运行的Java应用程序都使用相同的JVM,或者“每个Java应用程序一个JVM”是否适用?(假设应用程序是IntelliJ IDEA,例如服务器和NetBeans) 此外,在分配的JVM和每个Java应用程序使用的进程之间是否存在任何连接?每个Java应用程序都有一个JVM。它们之间不应该有任何连接,除非您建立了连接,例如通过网络。如果您在IDE中工作,那么您编写的代码通常在单独的JVM中运行。IDE通常会连接单独的JVM进行调试。如果要处理多个web应用程序,如果将它们部署到同一web

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


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

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

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

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

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


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

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

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

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

不过,这些信息可能对某些人有用。在Linux系统中,如果您想知道有多少JVM正在运行,可以尝试以下命令

$ ps -ef | grep "[j]ava" | wc -l
ps
列出进程,
grep
搜索包含“java”的进程,
wc
计算返回的行数


简短回答:通常,是的,每个JVM都有一个应用程序。 详细回答:JVM可以这样使用,这可能是最好的选择,但不一定要这样

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

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

<> P> >这完全取决于你认为的<代码>应用程序>代码>。如果你纯粹是在谈论“当‘主’()时运行的东西”,那么你就在JVM上查看一个应用程序——当操作系统启动JVM时,JVM运行一个类的“代码>公共静态空隙主体”()/<代码>方法。


但是一旦你的应用程序开始变得越来越复杂,你的边界就会变得越来越模糊。像Intellij或Eclipse这样的IDE将在同一个JVM或不同的JVM中重用与“javac”相同的东西,并做不同的工作(如重新绘制屏幕)。而web应用程序的用户在(共享JVM)上application server实际使用的“核心”应用程序可能与通过命令行在本地使用的“核心”应用程序几乎相同。

事实上,这是一个可能会有非常令人困惑的答案的问题。要保持简短:

  • 是的,每个java进程,每个JVM
  • 运行时和ProcessBuilder遵循此规则
  • 使用反射加载jar,然后执行main不会产生新的JVM

  • 这是一个很好的问题