JVM从原理到调优
JVM的定位
JDK 包含 JRE 包含JVM
将类文件运行的流程
javac编译流程
类加载机制
整体流程:
装载 -> 链接 ->初始化
装载
从指定的路径或源(如文件系统、网络等)中查找并加载类的字节码到 Java 虚拟机中
-
找到文件所在未知:全路径 -> 类加载器 -> 寻找类

-
类加载器加载时,先尝试让parent去加载,parent加载不到才会去加载
打破双亲委派的方法:重写loadClass方法,打破原有先尝试让parent加载的规则
-
类文件的信息交给JVM
- 类的静态信息(如类结构和静态变量) -> 方法区
- 类的对象实例-> 堆内存
链接
-
验证
- 保证被加载的类的正确
-
准备
- 要为类的静态变量分配内存空间,并将其值初始化默认值
-
解析
- 将类中的符号引用转为位直接引用
- 符号引用: class 文件中使用符号做的"代称"
- 将类中的符号引用转为位直接引用
初始化
为静态变量赋真正的值
运行时数据区

方法区 Method Area
方法区只有一个,线程共享(线程非安全),生命周期和虚拟机一致,存储类信息,常量,静态变量,即时编译器编译后的代码
垃圾回收机制一般不讨论方法区的回收
方法区也会报OOM
堆 Heap
堆只有一个,线程共享(线程非安全),生命周期和虚拟机一致,存储对象和数组
会报OOM
Java虚拟机栈
一个线程创建代表一个栈
方法数量溢出栈会报StackOverFlow
栈帧
- Local Variables
- Operand Stacks
- Dynamic Linking
- Invocation Completion


浙公网安备 33010602011771号