0%

JVM梳理

序言

岁月悠悠,衰微只及肌肤;热忱抛却,颓唐必致灵魂

今天来总结一下JVM。

JVM的整体结构

JDK:JVM + 基础类库 + 编译工具;

JRE:JVM + 基础类库;

image-20200418145902839

image-20200418155204290

说明:

  1. 线程私有:虚拟机栈,本地方法栈,程序计数器;
  2. 线程共享:堆,方法区;
  3. 执行引擎:解释器(Interpreter)、JIT(即时编译器,编译器后端)、GC(垃圾回收器);
  4. JVM直接和操作系统对话;
  5. 先经过类加载器,类信息放在方法区中,类的实例对象放在堆中;
  6. 解释器逐行解释代码,翻译成机器码;

栈是属于线程的,堆是属于进程的

此外,stack创建的时候,大小是确定的,数据超过这个大小,就发生stack overflow错误,而heap的大小是不确定的,需要的话可以不断增加。

Java代码执行流程

image-20200418151219263

JVM的架构模型

image-20200418151623527

image-20200418151703860

JVM的生命周期

image-20200418154808045

image-20200418155021200

说明:

  1. jps查看JVM进程

类加载子系统

image-20200418155255836

image-20200418155548287

image-20200418155604895

image-20200418155641028

image-20200418160000057

image-20200418160516538

  1. 加载:

    image-20200418160817268

    image-20200418161024792

    image-20200419153054534

    image-20200419153129167

    讲图:

    instanceKlass相当于一种数据结构;

    堆中存放Person.class的类对象,这个类对象有instanceKlass的内存地址

    instanceKlass也存放着Person类对象的内存地址;

对于Person的实例化对象来说,对象头部存放Person类对象地址;

那么就会先去找class类对象,再间接去元空间去找instanceKlass对象,再之后就会去元空间里面找_Methods,_fields,去调用对象方法。

  1. 链接:

    image-20200418161125751

    验证:

    1. 文件格式验证:0xCAFEBABE

    2. 元数据验证:对字节码描述的信息进行语义分析

    3. 字节码验证:最复杂

      通过数据流分析和控制流分析,确定程序是合法的,符合逻辑的

    4. 符号饮用验证:确保解析行为可以正常运行

    准备:

    1. 对于final,static:
      1. 基本类型会直接给值
      2. 包装类就会先0再赋值
    2. 在JDK7之后,静态变量的内存不再方法区内,会跟着类对象存储在堆中。
    3. 常量也会在准备阶段被赋值;

    解析:其实就是#1->内存指针的过程;

  2. 初始化:

    image-20200418161953621

    image-20200418162523130

    讲图:

    ()就是给类变量赋值;

    类一旦被初始化,那么static{}代码块就会执行;

类加载器分类

image-20200418163927620

image-20200418164007063

image-20200418165041003

image-20200418165056893

启动类加载器

image-20200418165134118

扩展类加载器

image-20200418170248971

应用程序类加载器

image-20200418170341262

image-20200418170745232

用户自定义类加载器

image-20200418170831894

image-20200418171054380

image-20200418171316057

关于ClassLoader

image-20200418171426186

image-20200418172845950

image-20200418173249965

双亲委派机制

image-20200418173924676

image-20200418174739320

image-20200418180901719

沙箱安全机制

image-20200418180935740

类的主动使用和被动使用

image-20200418181420103

image-20200418185356560

image-20200418185453190

运行时数据区

image-20200418185723067

image-20200418192817976

image-20200418193138847

image-20200418194740732

程序计数器

image-20200418195102631

image-20200418195246131

image-20200418195504014

image-20200418195628415

image-20200418200332016

image-20200418200413151

image-20200418200450509

说明:

并行是时刻,并发是时间段;

并行是同时执行,并发是一个时间片内交替执行;

image-20200418203821322

虚拟机栈

image-20200418203923749

image-20200418204014794

说明:

栈空间也可以存放堆中对象的引用值;

栈:每个【线程】运行时需要的内存空间,每个线程只能有一个活动栈桢;

栈桢:每个【方法】运行时需要的内存空间:

​ 局部变量表/操作数栈/动态链接/返回地址

活动栈桢:对应着当前正在执行的方法,往往在栈顶部;

image-20200418205038016

image-20200418205108066

image-20200418205237524

image-20200418205309508

image-20200418205413293

image-20200418205716022

局部变量表

image-20200418205949373

image-20200418210220163

image-20200418210905110

image-20200418211004395

说明:静态方法是不允许使用this关键字的

image-20200418211757994

image-20200418212132545

image-20200418212227111

操作数栈

它是由数组实现的

image-20200418212650692

image-20200418212759619

image-20200418213405170

image-20200418213538778

Demo

image-20200418213646147

image-20200418213849929

栈顶缓存技术

image-20200418214034973

动态链接

image-20200418214152093

运行时常量池在方法区中;

image-20200419130449081

方法的调用

image-20200419130630076

image-20200419132125397

image-20200419132917680

虚方法和非虚方法

image-20200419133028099

image-20200419134117873

this/super基本上都是非虚方法,在编译期间就可以确定

invokestatic/invokespecial

image-20200419140113762

如果隐式调用父类的final方法(也就是不加super.),是invokevirtual

但如果super.的方式,则是invokespecial

子类重写也是invokevirtual

image-20200419150151752

image-20200419150436945

image-20200419151113451

方法重写

image-20200419151335851

image-20200419151451292

方法返回地址

image-20200419151808852

image-20200419152042892

本地方法接口

image-20200419152319866

image-20200419152355798

image-20200419152450717

image-20200419152549409

本地方法栈

image-20200419152635383

image-20200419152713001

image-20200419152747720