走进JVM

字节码

字节码【Bytecode】(1字节可以存256个,称为字节码)

指令:

200个左右(A 代表引用变量 I 代表int类型相关操作)

加载或存储指令(load、store)

运算指令(add、sub等)

类型转换指令(i2l、d2f等)

对象创建和访问指令(new、newxxx、getxxx、putxxx)

操作栈管理指令(pop、dup)

方法调用和返回指令(invokexxx、return)

同步指令(monitorenter、monitorexit)

字节码执行

4-3 即时编译流程

类加载过程

在冯诺伊曼定义计算机中,任何程序加载到内存才能和 CPU 进行交流。字节码.class文件需要加载到内存中才能实例化。Classloader 的使命就是加载 .class 文件到内存。加载类时,使用的是Parents Delegation Model,译为双亲委派模型(译作 “溯源委派加载模型”更合适)

图 4-4 Java类加载过程

图4-6 双亲委派模型

内存布局

关键词 Eden 【伊甸区】
survivor区 【存活区】
GC (Garbage Collection) 【垃圾回收】
YGC (Young Garbage Collection) 【新生代垃圾回收】
FGC(Full Garbage Collection) 【全范围的垃圾回收】
GC Roots【类静态属性引用对象、常量引用的对象、虚拟机栈中引用的对象、本地方法栈中引用的对象 等】
CMS回收器 (Concurrent Mark Sweep Collection)
Humongous 【特殊的 Old 类型,专门存放大型对象】

图 4-8 经典JVM 内存布局

1. Heap(堆区)

图 4-9 对象分配和简要的 GC 流程图

2. Metaspace(元空间)

  • 常量池
  • 方法元信息
  • klass类元信息

3. JVM Stacks (虚拟机栈)

  • 局部变量表
  • 操作栈
  • 动态连接
  • 方法返回地址

4. Native Method Stacks (本地方法栈)

  • 本地方法【不受 JVM 约束】
  • 本地方法调用 JVM数据 ,通过 JNI(Java Native Interface)

5. Program Counter Register ,PC(程序计数寄存器)

图 4-12 Java的线程与内存

对象实例化

垃圾回收

主要目的:清除不再使用的对象

1. 如何判断对象是否存活?

  • 一个对象和 GC Roots 没有直接或间接的引用关系
  • 相互环状循环引用

2. 垃圾回收算法

  • “标记 - 清除算法”
  • “Mark - Copy” 算法
  • “标记 - 整理算法”

3. 垃圾回收器

当前垃圾回收器一共有数十种,我们讨论 Serial、CMS、GI三种。

Serial 回收器

  • 主要应用于 YGC
  • 方式:串行单线程
  • 缺点:FGC耗时长,频繁 FGC 会严重影响应用程序性能

图 4-13 Serial 回收流程

CMS回收器

  • 初始标记(Intitial Mark)
  • 并发标记(Concurrent Mark)
  • 重新标记(Remark)
  • 并发清除(Concurrent Sweep)

G1回收器

  • 初始标记(Intitial Mark)
  • 根区域扫描(Root Region Scan)
  • 并发标记(Concurrent Mark)
  • 重新标记(Remark)
  • 清除(Cleanup)

图 4-14 G1 回收模型内存布局

原文地址:https://www.cnblogs.com/sweetorangezzz/p/13179501.html