最简单的JVM内存模型

JVM的图看了无数遍,但是不自己亲手画一遍,总是看过就忘,今天就画一下

在这里插入图片描述

模型划分

JVM分为三部分,类加载器(Class Loader),运行时数据区(Runtime Data Area) 以及 执行引擎(Excution Engine)

类加载器和执行引擎以后再说,今天先归纳一下运行时数据区

运行时数据区可以分为两大部分,如上图左边绿色区域和右边蓝色区域,绿色区域包含程序计数器(Program Counter Register),虚拟机栈(JVM Stack)本地方法栈(Native Stack) 三个部分,是每个线程私有的;而右边蓝色区域包含堆(Heap)方法区(Method Area),是所有线程共享的

虚拟机栈中会为一个个的方法分配一块栈帧,每个栈帧中又有自己的局部变量表,操作数栈, 返回地址锁记录,局部变量表的内存空间是在编译器就确定下来的,运行时也不会改变,因为其中存放的是编译器就可知的基本数据类型.

执行流程

当.java文件被编译成.class文件并被类加载器load到运行时数据区时,所有的方法就会被load到方法区等待执行,并且在虚拟机栈中给main主线程分配一块内存空间,等待CPU调度执行,同时启动一个程序计数器.

当线程获取到CPU时间片时,main线程中的代码开始执行,首先在main线程栈中给main方法分配一块栈帧,并根据程序计数器的记录确定下一行执行的指令,当执行到method1,就会为method1分配一块栈帧内存,压在main栈帧的上方,同时会把返回地址(return address)指向调用者,而method1若调用了method2,则又会为method2分配一块栈帧,压在method1的上方,以此类推

当栈顶的方法被执行完毕,虚拟机栈就会释放这块栈帧空间,并根据返回地址依次往下执行,不断释放每个栈帧的内存,最后释放main方法的栈帧,然后销毁整个main线程栈和程序计数器,一个线程的生命周期就此结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值