JVM
定义
Java Virtual Machine - java 程序的运行环境(java二进制字节码的运行环境)
优点
- 一次编写,到处运行
- 自动内存管理,垃圾回收功能
- 数组下标越界越界检查
- 多态
比较

编译工具:javac、javap等
应用服务器:tomcat等
学习JVM的作用
- 应付面试
- 理解底层的实现原理(自动生成、foreach、动态代理)
- 中高级程序员的必备技能(解决内存溢出、响应过慢等问题)
常见的JVM
jvm也可以说是一种标准,很多公司都开发了不同的jvm

以HotSpot为主
学习路线

CSDN重要知识点
类的加载

loading
类的加载指的是将类的.class文件中的二进制数据读取到内存中,存放在运行时数据区的方法区中,并创建一个大的Java.lang.Class对象,用来封装方法区内的数据结构。(会创建类的Class对象)
linking
- 验证:确保Class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性。
- 准备:为类变量分配内存并且设置该类变量的默认初始化值,但不会为实例变量分配初始化。
1 | java中的变量介绍:成员变量和局部变量 |
initialization
- 为类变量赋予正确的初始化值。
- 类的初始化阶段就是执行类构造器方法
()的过程。(构造器方法主要用于执行静态变量赋值和static{}代码块运行) - 如果该类有父类,Jvm会保证子类的
()执行前,父类的 ()已经执行完成。
双亲委派机制
- 原理:如果一个类加载器收到了类加载请求,它并不会自己直接去加载,而是把这个亲求委托给父类加载器去执行,如果父类记载器还有父类,则进一步向上委托,依次递归,请求最终到达顶层的启动类加载器。如果父类加载器可以完成类加载任务,就成功返回,倘如父类加载器无法完成次加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。
- 优势:避免类的重复加载;保护程序安全,防止核心API被随意篡改。
主动使用和被动使用
java程序对类的主动使用:
- 创建类的实例化对象
- 访问某个类或者接口的静态变量,或者对该静态变量赋值
- 调用类的静态方法
- 反射加载类或者类中属性和方法
- 初始化类的子类
- 被标明为启动类的类
- 动态语言支持相关类
除了以上七种情况,其他使用java类的方式都被看做是对类的被动使用,都不会导致类的加载和初始化。
栈帧组成部分
- 局部变量表Local Variables(用于存储该栈帧的方法参数和定义在方法体内的局部变量)
- 操作数栈Operand Stack
- 动态链接Dynamic Linking(或指向运行时常量池的方法引用)
- 方法返回地址Return Address
方法区存放内容
静态变量+常量+类信息+运行时常量池