jvm

ClassLoader(类加载器)

加载过程:

  • 加载:通过类全名,获取类二进制流。将字节流代表的静态存储结构转化为方法区的数据结构。在堆中生成这个类的 Class 对象。
    • 启动类加载器(BootStrap ClassLoader):使用 c/c++ 实现的类,加载 java 核心库(包名为 java,javax,sun 开头的类)。
    • 扩展类加载器(Extension ClassLoader):继承至 ClassLoader 抽象类,加载系统变量 Djava.ext.dir 指定指定目录的类库或 jdk 中 jre/lib/ext 目录下的类库。
    • 系统类加载器(AppClassLoader):继承至 ClassLoader 程序默认的加载器,一般加载自定义类。
  • 连接:
    • 验证:查看字节流是否符合 Class 文件规范,符合则加载到方法区存储。语句检查。
    • 准备:静态常量(static final)直接赋值,为类(static)变量分配内存并设置默认初始值。
    • 解析:虚拟机将常量池内的符号引用替换为直接引用的过程
  • 初始化:执行 jvm 的 <clinit>() 类构造器方法,初始化静态变量和静态块中的数据。数据初始化按代码中的顺序执行。
    • 类的构造器方法在 jvm 中是 <init>() 方法, <clinit>() 类构造器方法也会先执行父类的类构造器方法。

Runtime Data Areas(运行时数据区)

线程共享 (且在虚拟机启动时创建) :

  • 方法区:存放类信息,常量池,静态变量,方法编译后的二进制形式的机器指令集。
  • 堆:存放 new 的对象实例和数组,在此分配内存。从内存回收角度堆还可分为新生代和老年代。

线程私有 (生命周期与线程共存) :

  • 虚拟机栈:存放栈帧,每一个栈帧表示一个方法,栈帧的入栈和出栈都表示了方法的调用和执行完成。
    • 栈帧:存放局部变量表(基本类型的变量和对象指向堆上的地址)、操作数帧、方法返回值、动态链接。
  • 本地方法栈:作用与虚拟机栈相同,只是服务的对象不同。
    • 虚拟机栈为 java 方法服务,本地方法栈为虚拟机使用到的 Native(本地)方法服务。
  • 程序计数器:存储当前线程所执行代码的字节码文件的行号。当前线程中断至线程恢复时的代码继续执行,依靠记录的内存地址(代码行号)。

执行引擎

本地方法接口