JVM篇:浅谈java虚拟机内存模型

博主最近尝试着了解JVM,博主目前的一些理解,总之会随着博主的深入了解慢慢完善吧

图片来自网络

当JVM运行时,便会创建这五个区域,退出时销毁。

JVM的五个区域:方法区、堆、栈(也可以称为虚拟机栈)、程序计数器、本地方法栈

博主在这里说明一下:方法区概括了元空间,在HotSpot(一种JVM,目前大多数人使用)中可以理解为方法区是一个标准,元空间则是实现它:jdk8版本以前称为永久代,jdk8后被彻底删除由元空间取代

  1. 方法区(主要存储区): 虽然方法区也是所有线程共享的, 但方法区与堆是区分开来的,它还有一个别名(Non-Heap即非堆,大致上就是为了区分开来堆),方法区存储了类的结构信息,即元数据,例如:运行时常量池、字段、方法数据、构造函数、方法代码、类加载器引用方法数据:指的是每个方法的修饰符、名字、返回类型、参数类型、属性,方法代码:指的是每个方法的字节码、操作数栈大小、局部变量大小、局部变量表、异常表和每个异常处理的开始位置、结束位置、代码处理在程序计数器中的偏移地址、被捕获的异常类的常量池索引),方法区可以固定容量大小,也可动态自动判断程序需求来决定是否扩展或缩小容量。

  2. :堆是所有线程共享的内存区域,是对象实例、数组存储的区域,它的容量可以是固定大小的,也可以随着程序执行的需求动态扩展,并在不需要过多空间时自动收缩
  3. :栈从字面上理解可以为:数据暂时存储的地方,它是一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表先入后出原则。当JVM得到一个Java字节码应用程序后,便为该代码中一个类的每一个方法创建一个栈框架,即栈帧,栈帧会随着方法调用而创建,随着方法结束而销毁(无论是正常完成或异常都算方法结束)。

    有下三类信息:

    局部变量

    执行环境(即栈帧对运行时常量池的引用、方法出口等)

    操作数栈                                                                                                                                                                          

  4. 程序计数器: 也可以称为寄存器,在该线程启动时,便会创建专属于它的寄存器,它的内容是指向下一个要执行的寄存器地址,也就是有着记录线程切换的作用。

  5. 本地方法栈:可以简单理解为它是java调用非java代码的接口,这部分过于高级,博主能力有限,大家可以自行去买相关书籍来理解底层代码。

猜你喜欢

转载自blog.csdn.net/qq_42709262/article/details/82259885