jvm虚拟机

本文详细解析了JVM的内存结构,包括方法区、堆、虚拟机栈、本地方法栈和程序计数器。讲解了各部分的作用,如方法区存储Java方法,堆用于全局数据,虚拟机栈和本地方法栈处理函数调用,静态变量存储于堆中,常量和元数据则分别位于方法区和堆。此外,还探讨了静态局部变量、元数据与class对象的区别以及内存中的数据存储策略。

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

jvm

首先从计算机原理角度理解jvm
存储指令,并顺序执行指令
可知:
任何程序都应包括
代码段和数据段以及PC寄存器
对应于jvm中

jvm结构

代码段:

方法区 主要存储java的一些方法

数据段:


虚拟机栈
本地方法栈

PC寄存器

程序计数器

虚拟机栈和本地方法栈:

jvm的虚拟机栈和本地方法栈可以类比操作系统的用户栈和内核栈
jvm是c++写的,jdk中内置了一些c++的方法,称为本地方法
调用这些方法,就需要另外的一套栈帧来存储局部数据

堆和栈:

  • 堆存放的是全局数据
    任何一段代码段都可以访问堆中的数据

  • 栈存放的局部数据
    局部数据具有随着代码段执行完毕就不再有用需要自动清除的特点所以选择栈来存储
    没个函数都具有一个栈帧,函数中的局部变量存在于栈帧中

  • 静态局部变量
    静态局部变量比较特殊,尽管他只能在函数内被访问,但他的生命周期却不在栈帧内,所以他也是存在堆中
    静态变量会随着class对象存在堆中

  • 方法区元数据 和 class的区别
    class对象存放在堆中
    元数据存放在方法区
    元数据包括:
    public 等修饰符
    void 等关键字
    class method 等对象都属于元数据

class Main{
static a=1;
final b=1;
public static main(){};
}

从Main.class文件加载后的Main class对象存放在堆中
静态变量a存放在class对象中 也在堆中
常量b存放在方法区的常量池中?
实例化后的Main对象存放在堆中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值