JVM内存模型体系结构(更新)

本文详细介绍了JVM内存模型,包括类加载过程、运行时数据区的各个部分如程序计数器、Java虚拟机栈、本地方法栈、Java堆和方法区。讲解了类加载的双亲委派模型,以及对象的创建和内存分配。同时,探讨了执行引擎中的垃圾回收器(GC)及其在内存管理中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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关键字的调用),凡是带了Native关键字的,说明java范围达不到,进入本地方法栈,调用本地方法库,拓展C++使用,融合不同的语言,JIN(本地方法接口)。
例如:在这里插入图片描述

对象

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


执行引擎

垃圾回收器(GC)

垃圾回收

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值