Java程序运行原理详解
Java程序的运行原理涉及从源代码到最终执行的完整过程,主要包括编译、类加载、字节码解释/编译执行等关键阶段。下面我将详细解析Java程序的完整运行机制。
一、Java程序运行的整体流程
A[Java源代码.java文件] --> B[编译期javac编译]
B --> C[字节码文件.class文件]
C --> D[运行期<br>Java虚拟机JVM]
D --> E[类加载子系统]
E --> F[运行时数据区]
F --> G[执行引擎]
G --> H[操作系统硬件]
二、编译阶段:从Java源码到字节码
1. 源码编写
// HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
int result = add(5, 3);
System.out.println("结果: " + result);
}
public static int add(int a, int b) {
return a + b;
}
}
2. 编译过程
# 使用javac编译器编译
javac HelloWorld.java
编译过程详解:
-
词法分析:将源代码分解为token(关键字、标识符、运算符等)
-
语法分析:构建抽象语法树(AST)
-
语义分析:检查类型、作用域等语义规则
-
字节码生成:生成与平台无关的.class文件
3. 字节码结构
// 使用javap查看字节码
javap -c HelloWorld
// 输出的部分字节码示例
public static int add(int, int);
Code:
0: iload_0 // 将第一个int型局部变量推至栈顶
1: iload_1 // 将第二个int型局部变量推至栈顶
2: iadd // 将栈顶两int型数值相加并将结果压入栈顶
3: ireturn // 从当前方法返回int
三、JVM架构与内存模型
JVM整体架构
┌─────────────────┐
│ 类加载子系统 │ ← .class文件
└─────────────────┘
↓
┌─────────────────────────────────┐
│ 运行时数据区 │
│ ┌───────┬───────┬──────────┐ │
│ │ 方法区 │ 堆 │ 虚拟机栈 │ │
│ │ │ │ 程序计数器 │ │
│ │ │ │ 本地方法栈 │ │
│ └───────┴───────┴──────────┘ │
└─────────────────────────────────┘
↓
┌─────────────────┐
│ 执行引擎 │ → 本地方法接口 → 本地方法库
└─────────────────┘
运行时数据区详细说明
1. 方法区(Method Area)
-
存储内容:类信息、常量、静态变量、方法字节码
-
特点:线程共享,逻辑上是堆的一部分
-
相关参数:
-XX:MetaspaceSize、-XX:MaxMetaspaceSize
2. 堆(Heap)
-
存储内容:对象实例、数组
-
内存结构:
┌─────────────┐ │ 新生代 │ ← Eden + Survivor0 + Survivor1 ├─────────────┤ │ 老年代 │ ← 长期存活的对象 ├─────────────┤ │ 永久代/元空间 │ ← JDK8+ 元空间替代永久代 └─────────────┘ -

最低0.47元/天 解锁文章
1767

被折叠的 条评论
为什么被折叠?



