JVM基础原理


JVM基础原理

jvm基础

jvm是什么?

jvm是运行在操作系统上的执行.class文件的虚拟机

jvm与操作系统的关系?

相同点都是可以执行对应的程序
不同点是jvm是可执行class文件与操作系统中间的一层(ps:某人说过计算机世界中的问题如果一个中间层不能解决就再加一个☺️)

jvm、jdk、jre之间的关系?

  • jdk>jre>jvm>操作系统

JjvW4I.png

java虚拟机规范与Java语言规范之间的关系?

java虚拟机规范是定义执行.class文件的虚拟机的规范;
java语言规范是定义java文件的规范

jvm中的内存划分

java比c等系列的语言引以为豪的就是引入来自动内存管理机制,不让使用者在关心内存的管理。

  • 内存划分

Jvwl01.png

  1. 堆区
  2. 栈区(本地方法栈、java虚拟机栈)
  3. 程序计数器
  4. 本地内存(元空间、直接内存)

堆区

堆是一个由线程之间共享的内存区域。基本类型的对象会中栈上进行分配,而普通类型的对象会栈堆上进行分配。由于栈是线程独立的,因此就不存在并发问题

栈区

  • 虚拟机栈

Java虚拟机栈是基于线程级别的,每个线程都拥有独立都虚拟机栈。虚拟机栈的作用是存储栈帧栈帧的作用是是保存每个线程当前运行方法的状态或值。

栈值中分为:

  • 局部变量表(用于存放方法参数和方法内定义的局部变量)
  • 操作数栈(存放方法运行期间的操作数或结果)
  • 动态连接(方法调用过程中的动态连接)
  • 方法返回地址

程序计数器

程序计数器是用来标记当前线程正在执行的程序运行到哪了一行。

元数据空间

元数据空间是JDK8中划分出来的,用于替代JDK7已经之前的Perm区(永久代)
元数据空间存储class信息常量池方法数据方法代码等等

总结

jvm中运行的参数是在上的信息,栈上保存的引用指向的是中的对象,类信息常量等信息则是放在元数据空间中。

类的加载机制

流程

加载 > 验证 > 准备 > 解析 > 初始化

执行时机早于,因为在装载到元数据区时就进行执行。

类加载器

  • Bootstrap ClassLoader

最底层的类加载器,用于加载java底层类的类加载器

  • Extention ClassLoader

扩展类的类加载器,用于加载lib/ext下的文件

  • App ClassLoader

应用加载器,用于加载classPath下的文件

  • Custom ClassLoader

自定义的类加载器


  TOC