为什么要创建多个jvm实例?

时间:2016-10-11 11:39:07

标签: java jvm

如果我们在一台机器上运行多个java程序,有人可以告诉我为什么会创建多个实例吗?为什么不能所有程序共享一个jvm并且java库是否会单独加载到所有jvm实例?

3 个答案:

答案 0 :(得分:1)

理论上,一个jvm可以是多个java应用程序的主机,但实际上可能存在很多干扰。

基于文档:

  

JVM有一组System.in/out/err,一个默认编码,一个默认语言环境,一组系统属性,依此类推。如果一个应用程序更改了这些应用程序,则会影   任何调用System.exit()的应用程序都会杀死所有应用程序。   如果一个应用程序线程变得疯狂,并且消耗太多的CPU或内存,它也会影响其他应用程序。

答案 1 :(得分:1)

  

如果我们在一台机器上运行多个java程序,有人可以告诉我为什么会创建多个实例吗?

当您多次运行任何程序时,它会创建该程序的多个实例。这不是Java独有的。

  

为什么不能所有程序共享一个jvm

您的程序应共享一个JVM,但这意味着您应该只启动一个JVM并告诉它运行哪个应用程序。是否要这样做是另一个问题。剪切应用程序增加了复杂性,实际上趋势是将单个整体变成多个微服务

分裂而不是组合JVM的一些原因。

  • 标准垃圾收集器的暂停时间随着所用堆的大小而增加。拆分应用程序意味着更多,更小的暂停。
  • 调整垃圾收集以简化工作负载更容易。如果你有混合的工作负荷,人们可能想要一个大的年轻空间而另一个则需要一个小的年轻空间。工作负载越混合,JVM就越难调整。
  • 如果您的应用程序中存在资源泄漏,解决此问题的唯一方法可能是重新启动JVM。如果每个应用程序都在自己的JVM中,则无需停止其他应用程序。
  • 您可能拥有可以关闭JVM的代码(填满内存,崩溃JVM或使其处于不可用状态)多个JVM可以限制此类故障的影响。
  • 强制您在关键组件之间进行明确分离,从而提高可维护性。这可以在巨石中完成,但需要门徒。
  

并且java库是否会单独加载到所有jvm实例?

JVM内存将JAR映射到内存中,它是操作系统,而不是JVM,后者决定是否或如何在进程之间共享JAR。

但是,每个需要类的JVM都会加载它并设置它的静态字段副本。

  

我的意思是说jvm如何在内存中加载公共库,因为如果两个jvm在内存中加载相同的类,那么在访问该类对象时可能会发生冲突

每个进程都有自己的内存空间。如果两个JVM加载相同的类,则这两个副本彼此之间没有交互,并且没有冲突的机会。

答案 2 :(得分:0)

因为如果有人杀死JVM,你不希望所有Java程序崩溃。 是的,Java库将单独加载。但Java程序告诉JVM哪些库要加载" import"关键字。