news 2026/4/23 18:45:34

当我们运行一个Java程序时,是否每个Java程序都会分配一个独立的Java虚拟机(JVM)实例呢?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
当我们运行一个Java程序时,是否每个Java程序都会分配一个独立的Java虚拟机(JVM)实例呢?

每运行一个Java程序,都会启动一个独立的JVM实例。但这里有几种情况和细节需要理解。

1.基本规则:一个进程对应一个JVM

每个Java程序 → 启动一个Java进程 → 创建一个JVM实例

例如:

  • 运行java -jar app1.jar→ 启动一个进程,创建一个JVM
  • 运行java -jar app2.jar→ 启动另一个进程,创建另一个独立的JVM
  • 同时运行上述两个程序 → 两个独立的JVM在运行

2.启动流程

命令行执行 java MainClass ↓ 操作系统创建新进程 ↓ 进程中加载JVM(jvm.dll/libjvm.so等) ↓ JVM初始化(分配堆、栈、方法区等内存) ↓ JVM执行MainClass.main()方法 ↓ 程序运行在独立的JVM环境中

3.多程序运行时的内存隔离

操作系统内存: ┌──────────────────────────────────────────────────┐ │ 进程1:JVM实例1 │ │ ┌──────────────────────────────────────────────┐ │ │ │ Java堆、栈、方法区等 │ │ │ └──────────────────────────────────────────────┘ │ │ │ │ 进程2:JVM实例2 │ │ ┌──────────────────────────────────────────────┐ │ │ │ Java堆、栈、方法区等 │ │ │ └──────────────────────────────────────────────┘ │ │ │ │ 其他进程... │ └──────────────────────────────────────────────────┘
  • 完全隔离:每个JVM实例拥有自己独立的内存空间
  • 互不影响:一个JVM崩溃不会直接影响其他JVM
  • 独立配置:每个JVM可以使用不同的启动参数(-Xmx, -Xms等)

4.特殊情况:多模块在同一个JVM中

有一些特殊场景,多个"程序"可能共享同一个JVM:

场景1:Web应用服务器
单个Tomcat进程(一个JVM) ├── Web应用1 ├── Web应用2 └── Web应用3
  • 多个Web应用部署在同一个应用服务器中
  • 它们共享同一个JVM堆内存
  • 但通过类加载器进行一定程度的隔离
场景2:OSGi容器
  • 多个OSGi bundle在同一个JVM中运行
  • 每个bundle有独立的类加载器
  • 但共享JVM的堆内存
场景3:Java EE应用服务器
  • 类似Web服务器,多个企业应用运行在同一个JVM中

5.验证方法

你可以通过以下方式验证:

Windows:
# 查看Java进程tasklist|findstr java# 或jps -l
Linux/Mac:
# 查看Java进程psaux|grepjava# 或jps -l
每个JVM的独立堆内存验证:
# 启动第一个程序,设置堆内存为512Mjava -Xmx512m -jar app1.jar# 启动第二个程序,设置堆内存为1Gjava -Xmx1024m -jar app2.jar# 两个程序会使用各自配置的内存大小,互不影响

6.与多线程的关系

一个JVM实例 ├── 线程1(有自己的栈、PC寄存器) ├── 线程2(有自己的栈、PC寄存器) ├── 线程3(有自己的栈、PC寄存器) └── 共享的堆内存、方法区
  • 一个JVM中可以有多个线程
  • 线程共享堆内存和方法区
  • 但每个线程有自己的栈和程序计数器

7.JVM实例的资源消耗

每个JVM实例都会消耗:

  1. 内存开销

    • JVM自身代码和数据
    • 堆内存(根据-Xmx设置)
    • 栈内存(每个线程约1MB)
    • 方法区/元空间
    • 直接内存
  2. CPU开销

    • JIT编译
    • 垃圾回收
    • 线程调度
  3. 启动时间

    • JVM初始化需要时间(类加载、JIT预热等)

8.为什么这样设计?

优点:

  1. 隔离性:一个程序崩溃不影响其他程序
  2. 灵活性:每个程序可以使用不同的JVM参数
  3. 安全性:程序间内存隔离,防止互相干扰
  4. 稳定性:错误被限制在单个JVM内

缺点:

  1. 内存冗余:每个JVM都有基本的内存开销
  2. 启动延迟:每个程序都需要JVM启动时间
  3. 资源竞争:多个JVM可能竞争系统资源

9.现代优化:GraalVM Native Image

新的技术如GraalVM Native Image可以将Java程序编译成本地可执行文件:

# 将Java程序编译为本地可执行文件native-image -jar app.jar app# 直接运行,无需启动完整的JVM./app
  • 启动更快(毫秒级)
  • 内存占用更小
  • 但仍然有一些限制
场景JVM实例数特点
运行独立Java程序每个程序一个JVM完全隔离,独立配置
Web服务器多应用一个JVM(服务器进程)共享堆,类加载器隔离
微服务架构每个服务一个JVM完全隔离,独立部署
容器化部署每个容器一个JVM资源限制,进程隔离

什么时候应该合并到一个JVM?

  1. 紧密相关的模块(如一个系统的多个组件)
  2. 资源受限环境(内存有限)
  3. 需要快速通信(通过内存共享数据)

什么时候应该分开多个JVM?

  1. 独立的应用(完全不同的业务系统)
  2. 需要不同配置(不同的GC策略、堆大小)
  3. 稳定性要求高(避免一个模块崩溃影响全部)
  4. 微服务架构(独立部署、独立伸缩)

资源管理提示

# 为每个JVM合理设置内存java -Xms256m -Xmx512m -jar app.jar# 监控JVM资源使用jstat -gc<pid>1000# 每秒查看GC情况jmap -heap<pid># 查看堆内存使用

结论

默认情况下,每个独立的Java程序都会启动一个专门的JVM实例,这是Java"一次编写,到处运行"特性的基础实现方式。这种设计提供了良好的隔离性和灵活性,虽然有一定的资源开销,但确保了程序的稳定性和可维护性。

在实际生产环境中,根据应用架构的不同(单体应用、微服务、Web应用服务器等),JVM的部署方式会有所调整,但基本原理保持不变:一个Java进程对应一个JVM运行时环境

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:16:59

VLA十年演进(2015–2025)

VLA十年演进&#xff08;2015–2025&#xff09; 一句话总论&#xff1a; 2015年VLA&#xff08;Vision-Language-Action&#xff09;还“不存在”&#xff08;仅单模态孤岛&#xff09;&#xff0c;2025年已进化成“万亿级多模态VLA端到端统一感知-语言-动作实时意图级自进化量…

作者头像 李华
网站建设 2026/4/23 12:17:09

BEV感知十年演进(2015–2025)

BEV感知十年演进&#xff08;2015–2025&#xff09; 一句话总论&#xff1a; 2015年BEV感知还是“手工IPM透视变换鱼眼拼接低分辨率2D鸟瞰”的辅助时代&#xff0c;2025年已进化成“万亿级多模态VLA端到端BEV实时4D动态占用量子鲁棒自进化”的核心感知时代&#xff0c;中国从跟…

作者头像 李华
网站建设 2026/4/23 12:17:16

轨迹预测十年演进(2015–2025)

轨迹预测十年演进&#xff08;2015–2025&#xff09; 一句话总论&#xff1a; 2015年轨迹预测还是“卡尔曼滤波恒速假设手工物理模型”的规则时代&#xff0c;2025年已进化成“万亿级多模态VLA端到端意图级轨迹预测实时社交博弈量子不确定性自愈全域动态自进化”的具身智能时代…

作者头像 李华
网站建设 2026/4/23 12:17:07

自主导航十年演进(2015–2025)

自主导航十年演进&#xff08;2015–2025&#xff09; 一句话总论&#xff1a; 2015年自主导航还是“2D激光SLAM规则路径规划结构化环境”的刚性时代&#xff0c;2025年已进化成“万亿级多模态VLA端到端自主导航实时4D动态意图理解量子鲁棒自进化全域社交永不迷路”的具身智能时…

作者头像 李华
网站建设 2026/4/23 15:31:46

智能论文写作解决方案,7 个网站提供格式规范与 LaTeX 模板适配

7 个 AI 生成论文网站推荐 论文格式规范 LaTeX 模板一键适配 工具快速对比排名&#xff08;前7推荐&#xff09; 工具名称 核心功能亮点 处理时间 适配平台 aibiye 学生/编辑双模式降AIGC 1分钟 知网、万方等 aicheck AI痕迹精准弱化查重一体 ~20分钟 知网、格子达…

作者头像 李华
网站建设 2026/4/23 13:09:21

3.51 带指定拿起放下约束的VRP:复杂物流场景下的路径规划实战

3.51 带指定拿起放下约束的VRP:复杂物流场景下的路径规划实战 引言 带指定拿起放下约束的VRP是复杂的物流场景。本文将演示如何求解这类复杂VRP问题。 一、复杂VRP 1.1 问题特点 # 复杂VRP def complex_vrp():"""带指定拿起放下约束的VRP""&quo…

作者头像 李华