JVM

【1】JVM概述

HotSpot VM 是目前市面上高性能虚拟机的代表作之一,它采用解析器与即时编译器并存的架构

JVM架构图如下????
【Java】JVM入门解析(一)

【2】JVM生命周期

虚拟机的启动

Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的

虚拟机的执行

一个运行中的Java虚拟机有着一个清晰的任务:执行Java进程
程序开始执行时他才运行,程序结束时他就停止
执行一个所谓的Java进程的时候,真真正正在执行的是一个叫做Java虚拟机的进程

虚拟机的退出

退出有如下几种情况:
1)程序正常执行结束
2)程序在执行过程中遇到了异常或错误而异常终止
3)由于操作系统出现错误而导致Java虚拟机进程终止
4)某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作
5)除此之华,JNI(Java Native Interface)规范描述了用Invocation API来加载或卸载Java虚拟机时,Java虚拟机的退出情况

【3】内存结构

【Java】JVM入门解析(一)

【4】类加载

整体架构

【Java】JVM入门解析(一)

1)类加载器子系统负责从文件系统或网络中加载class文件,class文件的文件开头有特定的文件标识
2)ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定
3)加载的类信息存放于内存空间中的方法区。除了类信息外,方法区中还会存放运行时常量池信息、字符串字面量和数字常量(这部分常量信息是class文件中常量池部分的内存映射)

类的加载过程概述 1

【Java】JVM入门解析(一)

1)class文件存放在磁盘中,可以理解为一个模板,加载class文件的过程就可以理解为根据磁盘中的模板在JVM中创建一个相同的实例
2)class文件加载到JVM中,被称为DNA元数据模板,存放在方法区
3)在 class文件 -> JVM -> 元数据模板 的这个过程中,就是通过类加载器(Class Loader)来完成的

类的加载过程概述 2

【Java】JVM入门解析(一)

类的加载过程概述 — 加载

1)通过一个类的全限定名获取定义此类的二进制字节流
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3)在内存中生成一个代表这个类的 java.lang.Class对象,作为方法区这个类的各种数据的访问入口

类的加载过程概述 — 链接

1)验证(Verify)

  • 确保class文件符合JVM虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全
  • 主要包括四种验证:文件格式验证、元数据验证、字节码验证、符号引用验证

2)准备(Prepare)

  • 为类变量分配内存并且设置该类变量的默认初始值,即零值
  • 这里不包含final修饰的static,因为final在编译的时候就会分配了,准备阶段会显式初始化
  • 这里不会为示例变量分配初始化,类变量会分配在方法区中,而示例变量是会随着对象一起分配到Java堆中

3)解析(Resolve)

  • 将常量池内的符号引用转换为直接引用的过程
  • 事实上,解析操作往往会伴随着JVM在执行完初始化之后再执行
类的加载过程概述 — 初始化
  • 初始化阶段就是执行类构造器方法 <clinit>() 的过程
  • 此方法不需要定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来
  • 构造器方法中指令按语句在源文件中出现的顺序执行
  • <clinit>()不同于类的构造器
  • 若该类具有父类,JVM会保证子类的<clinit>()执行前,父类的<clinit>()已经执行完毕
  • 虚拟机必须保证一个类的<clinit>()方法在多线程下被同步加锁

相关文章:

  • 2021-05-20
  • 2022-12-23
  • 2021-04-09
  • 2021-11-27
  • 2021-09-24
猜你喜欢
  • 2021-12-09
  • 2021-08-11
  • 2021-11-23
  • 2022-01-10
  • 2021-09-26
  • 2021-04-25
  • 2021-12-27
相关资源
相似解决方案