Java复习
java 复习
JVM
组成
- 类加载子系统
- 执行引擎
- 本地接口
- 运行时数据区:方法区、堆、栈、程序计数器
堆栈的区别
物理地址是否连续,内存分配,大小
内存泄露
长生命周期的对象持有短生命周期对象的引用
垃圾回收
- 分代复制垃圾回收
- 标记垃圾回收
- 增量垃圾回收
判断方法:引用计数、可达性分析,从根(栈上的变量)开始向下搜索。
类加载
类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三个部分统称为连接(Linking)。
何时开始类的初始化。
什么情况下需要开始类加载过程的第一个阶段:“加载”。虚拟机规范中并没强行约束,这点可以交给虚拟机的的具体实现自由把握,但是对于初始化阶段虚拟机规范是严格规定了如下几种情况,如果类未初始化会对类进行初始化。
- 创建类的实例
- 访问类的静态变量
- 访问类的静态方法
- 反射
- 当初始化一个类时,发现其父类还未初始化,则先触发父类的初始化
- 虚拟机启动时,定义了main()方法的那个类先初始化
以上情况称为称对一个类进行“主动引用”,除此种情况之外,均不会触发类的初始化,称为“被动引用”
被动引用:
- 子类调用父类的静态变量,子类不会被初始化。只有父类被初始化
- 通过数组定义来引用类,不会触发类的初始化
- 访问类的常量,不会初始化类
类加载过程
- 加载:类加载”(Class Loading)过程的第一个阶段。
- 验证
- 准备:准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起分配在Java堆中。
- 解析
- 初始化:类初始化是类加载过程的最后一步,前面的类加载过程,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的Java程序代码
如有继承,初始化步骤:
- 基类静态
- 派生类静态
- 基类普通代码块
- 基类构造函数
- 派生类普通代码块
- 派生类构造函数。
Java复习
http://blog.mornw.com/2022/02/20/学习/java/