JVM是如何运行起来的

单独类:

       在我们一个类中运行 main 方法,此时会自动开启一个 jvm 进程,他会默认一个main 线程,这个线程就负责执行 main 方法的代码,进而创建各种对象。

tomcat服务:

        tomcat 服务启动,类都会加载到 jvm 中去,有工作线程来执行我们的类方法,就会创建各种对象,实现业务逻辑。

<think>嗯,用户想要一个关于JVM运行时结构的解析图或说明。用户特别强调想要"解析图",说明需要直观的可视化呈现。翻看历史引用,发现5个参考资料都聚焦内存管理:引用1讲JVM内存布局的线程私有/共享区域划分;引用2和3详细说明方法区(永久代/元空间);引用4涉及常量池;引用5描述堆内存分代机制。这些正好构成JVM运行时数据区的核心内容。用户可能是在学习JVM内存模型时遇到抽象概念(如"方法区逻辑上属于堆但物理不连续"),需要图解辅助理解。结合引用2/3,要特别注意区分JDK版本差异——永久代和元空间的实现变化容易混淆。准备用结构化方式呈现:先全局视角展示JVM运行时数据区全貌,再用表格对比不同内存区域特性。针对核心模块如堆/方法区再做分层解剖,特别是要加入:1)JDK7与JDK8的方法区实现对比图2)堆内存分代结构示意图(来自引用5)3)常量池在.class文件与运行时态的关系(引用4的常量池解释很关键)对于用户需要的"解析图",准备用Mermaid生成标准示意图。考虑特别标注三个易错点:①程序计数器如何避免OOM;②虚拟机栈如何触发StackOverflow;③元空间使用本地内存的特性(来自引用2提到的非堆别名)。最后的流程图补充说明运行时数据流转逻辑,让静态结构和动态行为关联起来。检查到所有专业表述都需注意术语一致性:比如"方法区"不能写成"永久代"(JDK8已废弃),引用3说明过版本差异;"非堆"要加括号标注英文别名(引用2)。对于复杂概念如运行时常量池,需要明确其同时存在于方法区和.class文件的特性(引用4图示很有帮助)。</think> 以下是基于引用的JVM运行时结构解析图及详细说明(包含关键概念标注和版本差异): ### JVM运行时数据区结构图(Mermaid语法) ```mermaid graph TD A[JVM运行时数据区] --> B[线程私有区域] A --> C[线程共享区域] B --> B1[程序计数器] B --> B2[虚拟机栈] B --> B3[本地方法栈] C --> C1[堆内存] C --> C2[方法区] C1 --> C11[新生代] C11 --> C111[Eden区] C11 --> C112[Survivor区 S0] C11 --> C113[Survivor区 S1] C1 --> C12[老年代] C2 --> C21[类结构信息] C2 --> C22[运行时常量池] C2 --> C23[字段方法数据] style C2 fill:#f9f,stroke:#333 // 方法区标注特殊色 ``` --- ### 核心区域解析 1. **线程私有区域** - **程序计数器**: - 每个线程独有,记录当前执行指令地址(唯一不会发生OOM的区域)[^1] - **虚拟机栈**: - 存储栈帧(方法调用时创建),包含局部变量表、操作数栈等 - `StackOverflowError`(栈深度超标)/ `OOM`(无法扩展时)[^1][^3] - **本地方法栈**:功能类似虚拟机栈,服务于Native方法 2. **线程共享区域** - **堆内存**(最大共享区) - **新生代**(占堆1/3): - Eden区(新对象首选)+ 双Survivor区(S0/S1用于GC周转) - 默认比例 `Eden:S0:S1 = 8:1:1`[^5] - **老年代**(长期存活对象) - 触发GC的主要区域,OOM高频发生区[^3] - **方法区**(逻辑划分的共享区) ```java // 示例:方法区存储内容 类字节码 | 运行时常量池 | JIT编译代码 | 类静态变量 ``` - **JDK7-** - 称"永久代"(`PermGen`),受JVM内存上限约束 - **JDK8+** - 改称"元空间"(`Metaspace`),使用本地内存(不再直接受JVM参数限制)[^2][^3] - OOM风险:加载过多类或常量池溢出[^2][^3] 3. **重要子模块** - **运行时常量池**(方法区的一部分) - 存储.class文件中的符号引用(#1, #2等)和字面量[^4] - 字符串常量池(String Table)JDK7后移至堆中[^4] --- ### 内存动态流转示意图 ```mermaid flowchart LR A[新对象] --> B[Eden区] B -- Minor GC --> C{Survivor区} C -- 年龄阈值15 --> D[老年代] D -- Full GC --> E[垃圾回收] F[类加载] --> G[方法区] G -- 卸载类 --> H[回收元空间] ``` > 注:**程序计数器**是唯一无OOM的区域;**元空间**使用本地内存可降低OOM概率但非免疫;**字符串常量池**位置影响GC行为[^2][^4][^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值