java - 为什么会创建多个jvm实例?

标签 java jvm

<分区>

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

最佳答案

Can anyone please tell me why multiple instances will be created if we run multiple java programs in a single machine?

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

Why can't all programs share a single jvm

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

拆分而不是合并 JVM 的一些原因。

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

and will java libraries load separately to all jvm instances?

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

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

i mean to say how does jvm loads common libraries in memory because if two jvm loads same classes in memory then there might be conflict while accessing that class object

每个进程都有自己的内存空间。如果两个 JVM 加载同一个类,这两个副本之间没有交互,也不存在冲突的机会。

关于java - 为什么会创建多个jvm实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39976419/

相关文章:

java - 两个正整数乘以long的结果为负值

java - 以编程方式向布局添加多个按钮

java - 使用 Gson 反序列化包含对象列表的 JSON

java - 从一个命令启动多个java程序(多个JVM)

java - JVM 类加载器无法从扩展类路径加载自定义 jar

java - JVM 中的 if(true)。如何生成合适的指令?

java - 当 JRockit Console 窗口打开时,ColdFusion Java 堆工作正常,但当 JRockit Console 关闭时,内存使用量会急剧上升然后崩溃

java - 使用 Java 在单个语句中运行多个 Hive 查询时出错

java - 纯java模块中的StringDef?

java - 分发预配置的 Eclipse 的好解决方案?