JVM结构学习笔记

JVM可分为5个部分

1.类加载器(Class Loader)

2.运行时数据区(Runtime Data Area)

3.执行引擎(Execution Engine)

4.本地库接口(Native Interface)

5.本地方法库(Native Libraies)

这其中最复杂的是运行时数据区,又可分为方法区、虚拟机栈、堆、程序计数器,并且方法区和堆是线程共享的,虚拟机栈、本地方法栈、程序计数器是线程隔离的,JVM的结构入下图所示。
在这里插入图片描述
搞清楚了JVM虚拟机的结构,接下来我们详细讲解它的每一部分。
类加载器:加载字节码文件到内存

执行引擎:对JVM指令进行解析,翻译成机器码,解析完成后提交到操作系统中。

本地库接口:供Java调用的融合了不同开发语言的原生库。

本地方法库:Java本地方法的具体实现

运行时数据区:jvm核心内存空间结构模型

运行时数据区是JVM内存结构最重要的部分,接下来我们详细讲解运行时数据区的各个组成部分。

1.方法区

方法区存储虚拟机加载的类信息、常量、静态变量。即时编译器编译后的代码等数据。方法区是一种规范。永久代是方法区的一种实现,这里有个常考的面试题:jdk7以前的版本字符串常量池是放在永久代中的,jdk7将字符串常量池移动到了堆中,jdk8直接删除了永久代,改用元空间替代永久代。

2.本地方法栈

本地方法栈与Java栈的作用和原理相同,都可以用来执行方法,不同点在于Java栈执行的是Java方法,本地方法栈执行的是本地方法。

3,程序计时器

程序计数器占用的内存空间较小,是当前线程所执行的字节码行号指示器,通过改变这个计数器的值来选取吓一跳需要执行的字节码指令。多个线程之间的程序计时器互相独立,互不影响,为了保证每个线程都恢复后都可以找到具体的位置。

4.Java堆

Java堆用来存放实例化对象,Java堆被所有线程共享,在虚拟机启动时创建,用来存放对象实例,是Java内存结构中的大头,占用大部分的空间,是GC的主要管理区域,又可分为年轻代,老年代,永久代,jdk8及以后去掉了永久代。

5.虚拟机栈

Java方法执行的内存模型,Java栈中存放的多个栈帧,每个栈帧对应一个被调用的方法,主要包括局部变量表、操作数栈、动态连接、方法返回地址。每一个方法的执行,jvm都会创建一个栈帧,并且将栈帧压入Java栈,方法执行完毕,该栈帧出栈。
在这里插入图片描述

局部变量表

存储方法执行过程中的所有变量,包括方法中声明的局部变量和形参。

操作数栈

方法中的计算过程都是借助于操作数栈。

栈的具体运算方式是这样的,编译器是通过两个栈来实现的,一个是保存操作数的栈,另一个是保存运算符的栈。我们从左向右遍历表达式,当遇到数字,直接压入操作数栈。当遇到运算符,先与运算符栈的栈顶元素进行比较,如果高于当前栈顶元素的优先级,直接压入,否则取出当前栈顶的运算符,同时取出操作数栈的前两个数据进行运算,并将结果压入操作数栈。再次重复上述步骤,直到当前的运算符被压入栈中,当没有新的运算符需要入栈的时候,取出当前的栈顶元素以及操作数栈的两个运算,进行运算,将结果压入操作数栈,如果方法定义时需要返回值,直接将操作数栈栈顶元素返回即可

方法返回地址

一个方法调用结束之后返回到调用它的地方,所以栈帧中要保持能够能返回到方法调用处的地址。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值