JVM内存模型

JVM内存模型

框架图:
在这里插入图片描述
过程:首先通过编译器把 Java 代码转换成字节码,类加载器(ClassLoader) 再把字节码加载到内存中,将其放在运行时数据区(Runtime data area)的方法区内,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作 系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将 字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他 语言的本地库接口(Native Interface)来实现整个程序的功能。

JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、 Execution engine(执行引擎);两个组件为Runtime data area(运行时数据 区)、Native Interface(本地接口)。

  • Class loader(类装载):根据给定的全限定名类名(如: java.lang.Object)来装载class文件到Runtime data area中的method area。
  • Execution engine(执行引擎):执行classes中的指令。
  • Native Interface(本地接口):与native libraries交互,是其它编程语 言交互的接口。
  • Runtime data area(运行时数据区域):这就是我们常说的JVM的内 存。
          • -

类加载过程

在这里插入图片描述
类加载过程:加载>连接>初始化。连接过程⼜可分为三步:验证>准备>解析。
过程:

  1. 通过全类名获取定义此类的⼆进制字节流
  2. 将字节流所代表的静态存储结构转换为⽅法区的运⾏时数据结构
  3. 在内存中⽣成⼀个代表该类的 Class 对象,作为⽅法区这些数据的访问⼊⼝

面试拓展:


知道哪些类加载器?
JVM 中内置了三个重要的 ClassLoader,除了 BootstrapClassLoader 其他类加载器均由 Java 实现且
全部继承⾃ java.lang.ClassLoader :

  1. ClassLoader(启动类加载器) :最顶层的加载类,由C++实现,负责加载
    %JAVA\_HOME%/lib ⽬录下的jar包和类或者或被 -Xbootclasspath 参数指定的路径中的所
    有类。
  2. ExtensionClassLoader(扩展类加载器) :主要负责加载⽬录 %JRE\_HOME%/lib/ext ⽬录下
    的jar包和类,或被 java.ext.dirs 系统变量所指定的路径下的jar包。
  3. AppClassLoader(应⽤程序类加载器) :⾯向我们⽤户的加载器,负责加载当前应⽤classpath下
    的所有jar包和类。

双亲委派

双亲委派

          • -

运行时数据区

Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存区域划分为若干个 不同的数据区域。**这些区域都有各自的用途,以及创建和销毁的时间,有些区域 随着虚拟机进程的启动而存在,有些区域则是依赖线程的启动和结束而建立和销 毁。Java 虚拟机所管理的内存被划分为如下几个区域:
在这里插入图片描述
不同虚拟机的运行时数据区可能略微有所不同,但都会遵从 Java 虚拟机规范, Java 虚拟机规范规定的区域分为以下 5 个部分:

  • 程序计数器(Program Counter Register):当前线程所执行的字节码的行号 指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的 字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个 计数器来完成;
  • Java 虚拟机栈(Java Virtual Machine Stacks):Java虚拟机栈不存在垃圾回收,线程结束栈over保存栈针,保存8大变量+对象引用+实例方法; 下图为虚拟机栈中内容。

在这里插入图片描述

  • 本地方法栈(Native Method Stack):与虚拟机栈的作用是一样的,只不过虚 拟机栈是服务Java 方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;
  • Java 堆(Java Heap):Java 虚拟机中内存大的一块,是被所有线程共享的,存放类、方法与常量。分为三个部分新生区、老年区以及永久区(1.8后改为元空间),GC主要发生在新生区以及老年区;
  • 方法区(Methed Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。

面试拓展:
Java虚拟机栈、本地方法栈、程序计数器是线程私有。

OMM问题:内存满了。解决措施扩大JVM内存,如还出现OOM则说明代码有问题,分析内存。

本地方法栈中native关键字(联系volatile关键字的调用),凡是带了Java关键字的,说明java范围达不到,进入本地方法栈,调用本地方法库,拓展C++使用,融合不同的语言,JIN(本地方法接口)。
例如:JVM内存模型体系结构(更新)教程

对象

对象的创建、分配内存、定位

          • -

执行引擎

垃圾回收器(GC)

垃圾回收

标签: 加载, Java, 虚拟机, 内存, 字节, JVM, 体系结构

相关文章推荐

添加新评论,含*的栏目为必填