关于jvm:JVM知识串联

6次阅读

共计 1878 个字符,预计需要花费 5 分钟才能阅读完成。

指标

读完周志明老师《深刻了解 Java 虚拟机》之后,感觉须要将书读薄,将外面的常识死记硬背。所以以一个 Class 的生命周期作为角度重新整理常识,有一个残缺的认知。

生命周期

  1. 编译:将 java 源代码通过编译器编译成合乎 class 文件标准的二进制 class 文件。
  2. 加载:依照肯定的初始化的规定程序,进行加载、验证、筹备、解析和初始化的过程,将类加载到办法区,实现类的定义加载到虚拟机。
  3. 实例化:应用 new 命令进行实例化对象,依照之前加载的类进行分片空间,将对象调配到堆。
  4. 执行:依据命令执行执行,其中办法调用波及多态的抉择,波及程序计数器和虚拟机栈的应用。
  5. 收集:在命令的执行会产生很多对象散布在 JVM 内存中,会依据不同的策略进行收集。

编译

将 java 源码代码编译成合乎 class 文件标准的二进制 class 文件。而 class 文件的格局如下

ClassFile {
 u4 magic;
 u2 minor_version;
 u2 major_version;
 u2 constant_pool_count;
 cp_info constant_pool[constant_pool_count-1];
 u2 access_flags;
 u2 this_class;
 u2 super_class;
 u2 interfaces_count;
 u2 interfaces[interfaces_count];
 u2 fields_count;
 field_info fields[fields_count];
 u2 methods_count;
 method_info methods[methods_count];
 u2 attributes_count;
 attribute_info attributes[attributes_count];
}

加载

将 class 文件依照初始化的触发条件通过类加载器进行加载。

初始化的条件

  1. 执行 new、getstatic、putstatci、invokestatic 指令
  2. 反射调用
  3. 类存在父类,父类先初始化,接口不须要
  4. 启动须要执行的主类
  5. JDK7 中,MethodHandle 解析构造 REF_getStatic、REF_putStatic、REF_invokeStatic
  6. JDK8 中,定义接口的默认办法,如果实现类产生初始化,则接口先初始化

加载的生命周期

  1. 加载:将 class 文件加载到办法区和运行时常量池,存储类的常量池、字段和办法和一些非凡办法
  2. 链接

    1. 验证:验证 class 文件是否符合规范的文件
    2. 筹备:创立类或接口的动态变量,并且赋予默认值
    3. 解析:依据运行时常量池的符号援用决定具体的办法
  3. 初始化:初始化类变量和其余资源

解析的过程不肯定在筹备之后,也可能产生运行时进行解析,比方多态的应用

实例化

通过 new 命令进行实例化,实例化之后的对象不仅仅是定义的类的构造,也存在一些用于收集和并发管制的须要的信息,而后在堆内依照肯定的约定在不同的区域进行调配。

对象组成

  1. 对象头

    1. 哈希码
    2. GC 分代年龄
    3. 锁状态标记
    4. 线程持有的锁
    5. 偏差线程 ID
    6. 偏差工夫戳
    7. 类型指针
  2. 实例数据
  3. 对齐填充

对象存储地位

  1. 大多数对象间接调配到 Eden 区
  2. 大对象(须要大量间断内存)调配到 Tenured 区
  3. 对象在 Survivor 区熬过一次新生代 GC 年龄减少 1,当减少到 15,存储在老年代
  4. Survivor 空间雷同年龄的所有对象大小总和大于 Survivor 的一半

执行

依据 class 文件解析之后的命令应用虚拟机栈和程序计数器进行执行,其中会存在办法多态的一个解析。

虚拟机栈组成

  1. 局部变量表:办法入参,局部变量
  2. 操作数栈:用于执行存储执行命令须要的参数
  3. 动静链接:指向运行时的常量池的援用
  4. 办法返回地址

收集

JVM 中的内存不同区域会在不同的状况下会进行不同的收集。

收集堆

  1. Eden 区空间不能进行调配会进行 MinorGC,将存活的对象存储在 Survivor 区
  2. Survivor 区对象年龄达到 MaxTenuringThreshold 值会存储在 Tenured 区
  3. Survivor 区雷同年龄的所有对象大小总和大于 Survivor 区空间的一半,大于等于该年龄的对象进入 Tenured 区
  4. MinorGC 进行空间调配担保,如果 Tenured 区的可用的间断空间小于降职 Tenured 区均匀大小,则进行 FullGC,如果大于,同时 HandlePromotionFailure 为 true,则进行冒险 MinorGC,如果还是不够则进行 FullGC
  5. Tenured 区空间不够,会先进行 MinorGC,如果空间还是有余则进行 MajorGC

收集办法区

  1. 没有进行援用的常量,则收集
  2. 收集类型

    1. 该类下的所有实例曾经被回收
    2. 加载改类的类加载器被回收
    3. 类的 class 对象没有被援用
正文完
 0