JVM 学习笔记
1.jdk, jre, jvm 的区别
1.1 javac 编译步骤
词法分析
语法分析
语义分析
中间代码的生成
目标代码的生成
出错的处理
2.class 文件格式解读
cafe babe
u4 代表 8 个 16 进制,表示 4 个字节
u2 代表 2 个 16 进制,表示 2 个字节
3. jvm 加载 class 文件的三个阶段
3.1 装载(Loading):
查找 class 文件,ClassLoader.loadClass(),根据全称进行加载,得到二进制流数据
将二进制数据进行读取:类的描述信息(时间、作者、版本等)(保存在方法区)
存储 class 对象,比如 Bean 对象 (存储在堆区)
装载也有验证的过程
3.2 链接 Linking:获取类或接口并将其组合到 Java 虚拟机的运行时代以便可以执行的过程。
复制代码
验证:确保二进制结构是对的
准备:创建静态字段:public static int FLAG = 1;
解析:将类的符号转换为直接引用
3.3 初始化:对类的静态变量,和静态代码块进行初始化
Bootstrap 加载 java_home 所有 class
extension 加载 java 拓展 jar 包
app 加载 classpath 中指定的 jar
custom 加载自行决定的 jar 文件或 class
双亲委派模型:
虚拟机栈:
栈帧(1 个方法对应一个栈帧):局部变量表,操作数栈,动态链接,正常/错误的返回(返回地址)
javap
动态加载
4.
JVM 所管理的内存分为以下几个运行时数据区:程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区。
版权声明: 本文为 InfoQ 作者【Changing Lin】的原创文章。
原文链接:【http://xie.infoq.cn/article/5cf9f79dc8c40604746d4f6ee】。文章转载请联系作者。
评论