JVM体系概述

JVM的位置:

jvm是运行在操作系统之上的,他与硬件没有直接的交互
在这里插入图片描述

JVM体系结构概述

在这里插入图片描述在这里插入图片描述

类加载器ClassLoader

负责加载class文件,class文件在文件开头有特定的文件标示,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构并且ClassLoader只负责class文件的加载,至于它是否可以运行,则有Execution Engine决定。
在这里插入图片描述
类加载是一个将class字节码文件实例化成Class对象并进行初始化的过程。

ClassLoader有哪些(3+1)

  1. 启动类加载器(Boopstarp)C++
  2. 扩展类加载器(Extension)java

第二层在JDK9版本中称为Platform ClassLoader即平台类加载器 JDK8及之前的加载器是Extension
ClassLoader,

  1. . 应用程序加载器(AppClassLoader)

Java也叫系统类加载器,加载当前应用的classpath的所有类

  1. 用户自定义加载器

Java.lang.ClassLoader的子类,用户可以定制类的加载方式

双亲委派模型

在这里插入图片描述当一个类收到一个加载请求后,不会立即去加载这个类,而是把请求委派给父类去完成,每一层的加载器都是这样,只有当父类无法完成加在时,在会将该请求反馈给子类,让子类去尝试加载该类,如果都不能加载就会报,类找不到异常(ClassNotFoundException)
在这里插入图片描述

PC寄存器(程序计数器)

每读一个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法取中的方法字节码 (用来存储指向下一条指令的地址,也即将要执行的指令代码) ,由执行引擎读取下一条指令,是一个非常小的内存空间,
它是当前线程所执行的字节码的行号指示器

方法区(Method Area)

供个线程共享的运行时内存区域。它存储了每一个类的结构信息,例如:运行时常量池(Runtime Constant Pool)、字段、方法数据、构造函数和普通方法的字节码内容。

栈(Stack)

栈也叫栈内存,主管Java程序的运行,是在线程创建时创建,他的生命周期是跟随线程的生命期,线程结束栈内存也就会释放,对于栈来说不存在垃圾回收的问题。
基本数据类型+对象的引用变量+实例方法都是在函数的栈内存中分配

栈存储什么????

1.本地变量:输入和输出参数以及方法以内的变量
2. 栈操作: 记录出栈、入栈的操作
3.栈帧数据:包括类文件、方法等
4.方法返回的地址

栈运行原理?

每个方法执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息,每一个方法从调用直至执行完毕的过程,就对应着一个栈帧在虚拟机中入栈到出栈的过程。栈的大小和具体JVM的实现有关,通常在256K~756K之间,与等于1Mb左右。

栈+堆+方法区的交互关系

在这里插入图片描述HotSpot是使用指针的方式来访问对象:
Java堆中会存放访问类元数据的地址,
reference存储的就直接是对象的地址

Native Interface本地接口

本地接口的作用是融合不同的编程语言为 Java 所用,它的初衷是融合 C/C++程序,Java 诞生的时候是 C/C++横行的时候,要想立足,必须有调用 C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码,它的具体做法是 Native Method Stack中登记 native方法,在Execution Engine 执行时加载native libraies。
目前该方法使用的越来越少了,除非是与硬件有关的应用,比如通过Java程序驱动打印机或者Java系统管理生产设备,在企业级应用中已经比较少见。因为现在的异构领域间的通信很发达,比如可以使用 Socket通信,也可以使用Web Service等等,不多做介绍

Native Method Stack

它的具体做法是Native Method Stack中登记native方法,在Execution Engine 执行时加载本地方法库。

Execution Engine执行引擎负责解释命令,提交操作系统执行。

在这里插入图片描述

发布了126 篇原创文章 · 获赞 6 · 访问量 3756

猜你喜欢

转载自blog.csdn.net/qq_40244391/article/details/103603704