我读了一个SO帖子,但那里没有得到答案。 Java应用程序是否每个都有一个独立的JVM? 我指的是通过public static void main(String [])方法启动的应用程序...
我假设你谈论的是通过public static void main(String[])
方法启动的应用程序……
理论上,您可以在一个JVM中运行多个应用程序。但实际上,它们可能会以各种方式相互干扰,例如:
System.in/out/err
,一种默认编码,一种默认区域设置,一组系统属性等。如果一个应用程序更改了这些,它将影响所有应用程序。System.exit()
的任何应用程序都将有效地关闭所有应用程序。简而言之,有很多问题。人们一直在努力使其工作,但他们从未真正成功过。一个例子是Echidna库,尽管该项目已经静止了约10年。 JNode是另一个例子,不过我们“作弊”,通过篡改核心Java类(如java.lang.System
),使每个应用程序看起来获得了独立的System.in/out/err
版本,系统属性等1。
1 - 这(“proclets”)应该是一个过渡性的黑客程序,等待使用真正的“隔离”的正确解决方案。但是,由于JNode架构使用单个地址空间而没有明显的方法来分离“系统”和“用户”内容,因此隔离支持停滞不前。因此,尽管我们可以创建与隔离API相匹配的API,但关键的隔离功能(例如干净地终止隔离)几乎不可能实现。至少,那是/是我的观点。
在每个应用程序中使用一个JVM,与每个应用程序使用操作系统进程基本相同。
以下是使用每个应用程序的进程的几个原因:
一些应用程序(例如Chrome)甚至采取更进一步的措施创建多个进程以隔离不同的标签和插件。
就Java而言,有更多的原因不要共享JVM。
虽然有几种情况下JVM实际上是应用程序之间共享的:
但在实践中,即使在服务器端Java中,出于上述原因,通常最好为每个应用程序使用JVM(或几个)。
用于隔离执行上下文。
如果其中一个进程挂起、失败或其安全性受到威胁,则其他进程不会受到影响。
我认为拥有单独的运行时环境也有助于 GC,因为它需要处理的引用比整个环境少。
此外,为什么要在一个 JVM 中运行它们所有?
Java应用服务器,如JBoss,旨在在一个JVM中运行多个应用程序