最近看了寒食君jvm系列视频,讲jvm内存分区,记录一波。
主要内容是:1.jvm内存分区的划分:按线程共享和线程独占的性质划分:堆和方法区属于线程共享的;程序计数器、虚拟机栈(可以理解为java方法栈)、本地方法栈(被native关键字修饰的方法栈)属于线程独占的
2.以上分区的作用及相关重点,对栈帧有详解
寒食君-【精讲JVM】程序计数器、虚拟机栈、本地方法栈这块彻底玩儿明白了
jvm内存分区又称jvm内存模型

方法区:略
堆:存放对象
虚拟机栈:java方法栈,与本地方法栈的对应的概念
本地方法栈:被native关键字修饰的方法栈
程序计数器:存放当前线程将要执行的指令地址
栈帧详解:
栈帧结构:局部变量区、动态链接、操作数栈、方法返回值
栈帧结构可以通过javap反编译class文件后观察。javap是JDK自带的反汇编器,可以通过反编译生成汇编代码
栈帧是什么?可以理解为方法调用的抽象,在jvm中,方法会被封装成栈帧。程序运行对应的是方法的调用,方法的调用对应的是栈帧的出入栈
栈帧的各个结构的作用:
1.局部变量区:存放局部变量信息
2.动态链接:动态链接对应类加载过程中的“解析”过程,将静态引用替换成直接引用。这个动态链接只会发生在多态的场景,因为非多态场景的引用替换可以直接在类加载的过程中解决掉、不必等到程序运行时解决
3.操作数栈:什么是操作数,可以理解为要操作的变量。为啥需要个栈保存这些变量,出入栈做运算方便??操作数栈直接会有块共享区域,为了解决操作数栈A的返回值恰好是操作数栈B的入参这样的场景,这是一种优化体现
4.方法的返回值:得到方法的返回值后会相应地把操作数值改掉
感受:
联系硬件内存理解jvm的内存分区会好理解一点;
javap反汇编命令没用过
实验javap反编译器观察汇编语言