Java复习

java 复习

JVM

组成

  1. 类加载子系统
  2. 执行引擎
  3. 本地接口
  4. 运行时数据区:方法区、堆、栈、程序计数器

堆栈的区别

物理地址是否连续,内存分配,大小

内存泄露

长生命周期的对象持有短生命周期对象的引用

垃圾回收

  1. 分代复制垃圾回收
  2. 标记垃圾回收
  3. 增量垃圾回收

判断方法:引用计数、可达性分析,从根(栈上的变量)开始向下搜索。

类加载

类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三个部分统称为连接(Linking)。

何时开始类的初始化。

什么情况下需要开始类加载过程的第一个阶段:“加载”。虚拟机规范中并没强行约束,这点可以交给虚拟机的的具体实现自由把握,但是对于初始化阶段虚拟机规范是严格规定了如下几种情况,如果类未初始化会对类进行初始化。

  1. 创建类的实例
  2. 访问类的静态变量
  3. 访问类的静态方法
  4. 反射
  5. 当初始化一个类时,发现其父类还未初始化,则先触发父类的初始化
  6. 虚拟机启动时,定义了main()方法的那个类先初始化

以上情况称为称对一个类进行“主动引用”,除此种情况之外,均不会触发类的初始化,称为“被动引用

被动引用

  1. 子类调用父类的静态变量,子类不会被初始化。只有父类被初始化
  2. 通过数组定义来引用类,不会触发类的初始化
  3. 访问类的常量,不会初始化类

类加载过程

  1. 加载:类加载”(Class Loading)过程的第一个阶段。
  2. 验证
  3. 准备:准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起分配在Java堆中。
  4. 解析
  5. 初始化:类初始化是类加载过程的最后一步,前面的类加载过程,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的Java程序代码

如有继承,初始化步骤:

  1. 基类静态
  2. 派生类静态
  3. 基类普通代码块
  4. 基类构造函数
  5. 派生类普通代码块
  6. 派生类构造函数。

Java复习
http://blog.mornw.com/2022/02/20/学习/java/
作者
朝霞换夕阳
发布于
2022年2月20日
许可协议