博主最近尝试着了解JVM,博主目前的一些理解,总之会随着博主的深入了解慢慢完善吧
图片来自网络
当JVM运行时,便会创建这五个区域,退出时销毁。
JVM的五个区域:方法区、堆、栈(也可以称为虚拟机栈)、程序计数器、本地方法栈
博主在这里说明一下:方法区概括了元空间,在HotSpot(一种JVM,目前大多数人使用)中可以理解为方法区是一个标准,元空间则是实现它:jdk8版本以前称为永久代,jdk8后被彻底删除由元空间取代
方法区(主要存储区): 虽然方法区也是所有线程共享的, 但方法区与堆是区分开来的,它还有一个别名(Non-Heap即非堆,大致上就是为了区分开来堆),方法区存储了类的结构信息,即元数据,例如:运行时常量池、字段、方法数据、构造函数、方法代码、类加载器引用(方法数据:指的是每个方法的修饰符、名字、返回类型、参数类型、属性,方法代码:指的是每个方法的字节码、操作数栈大小、局部变量大小、局部变量表、异常表和每个异常处理的开始位置、结束位置、代码处理在程序计数器中的偏移地址、被捕获的异常类的常量池索引),方法区可以固定容量大小,也可动态自动判断程序需求来决定是否扩展或缩小容量。
- 堆:堆是所有线程共享的内存区域,是对象实例、数组存储的区域,它的容量可以是固定大小的,也可以随着程序执行的需求动态扩展,并在不需要过多空间时自动收缩
栈:栈从字面上理解可以为:数据暂时存储的地方,它是一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表,先入后出原则。当JVM得到一个Java字节码应用程序后,便为该代码中一个类的每一个方法创建一个栈框架,即栈帧,栈帧会随着方法调用而创建,随着方法结束而销毁(无论是正常完成或异常都算方法结束)。
有下三类信息:
局部变量
执行环境(即栈帧对运行时常量池的引用、方法出口等)
操作数栈
程序计数器: 也可以称为寄存器,在该线程启动时,便会创建专属于它的寄存器,它的内容是指向下一个要执行的寄存器地址,也就是有着记录线程切换的作用。
扫描二维码关注公众号,回复: 4322554 查看本文章本地方法栈:可以简单理解为它是java调用非java代码的接口,这部分过于高级,博主能力有限,大家可以自行去买相关书籍来理解底层代码。