JVM内存结构与内存模型
字节码解释器通过改变这个计算器的值来选择下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复,如果执行的是Native方法,这个计算器的值则为空
- Java虚拟机栈(线程私有)
(1) 是什么
Java虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧,每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
(2) 组成
① 局部变量表
存放了编译期可知的基本类型、对象引用类型和returnAddress类型(指向一条字节码指令的地址。即程序就是存储在方法区的字节码指令,而 returnAddress 类型的值就是指向特定指令内存地址的指针)
② 操作数栈
操作数是一个后入先出栈,JVM所有的操作码都是对操作数栈上的数据进行操作,对于每一个方法的调用,JVM会建立一个操作数栈,以供计算使用。
例如 a = b + c 的字节码执行过程中操作数栈以及局部变量表的变化如下图所示。
局部变量表中存储着a、b、c 三个局部变量,首先将b和c分别入栈
③ 动态链接
运行期间转化为直接引用,就称为动态链接。Class字节码的常量持中存有大量的符号引用,在运行期才将符号引用变成直接引用(也就是指向数据),可以是方法或者字段的引用。
④ 方法出口
即本方法执行后下一步指令的地址,方法正常退出时,调用者PC计数器的值就可以作为返回地址,异常退出时,返回地址是要通过异常处理器来确定。
- 本地方法栈(线程私有)
(1) 是什么?
保存native方法进入区域的地址
- Java堆(线程共享)
(1) 是什么?
所有的对象实例以及数组都要在堆上分配。是垃圾收集器管理的主要区域。
(2) 分区
① 新生代: Eden区、Survivor From区、Survivor To区
② 老年代
- 方法区(线程共享)
(1) 是什么
方法区用于存储已被虚拟机加载的类信息、方法、常量、静态成员变量、JIT(即时编译器)编译后的代码等数据,在类加载时分配。
(2) 也叫非堆,分配在元空间
元空间:类的元数据,如方法数据、方法信息(字节码,栈和变量大小)、运行时常量池、已确定的符号引用和虚方法表等方法区的数据,保存在本地内存区域(堆外内存)
- 运行时常量池(线程共享)
(1) 是什么
运行时常量池用于存放编译期和运行期生成的各种字面量和符号引用。这部分内容将在类加载后进入方法区的运行时常量池中存放。属于方法区的一部分
(2) 字面量和符号引用
字面量:1.字符串;2.基本类型值;3.final常量 符号引用:1.类和方法的全限定名;2.字段的名称和描述符;3.方法的名称
二、 Jvm内存模型
- 定义
由于不同平台内存模型的差异,有可能导致程序在不同平台的并发访问出错。Java内存模型(Java Memory Model,JMM)是屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。
- 具体操作
定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量的底层细节。
此处的变量是指实例字段,静态字段和构成数组对象的元素,不包括局部变量与方法参数
- 主内存和工作内存
Jvm内存模型规定所有的变量都存储在主内存中,每条线程还有自己的工作内存,工作内存保存了被该线程使用到的变量的主内存副本拷贝。
- synchronization、final、volatile
(1) synchronization
① 互斥
对于一个monitor对象,当被一个线程持有,其他线程只能等待
② 可见性
保证了线程在同步代码块期间写入动作,对于后续进入该代码块的线程是可见的(持有相同monitor对象的线程)。
当前线程释放monitor对象,作用是把cpu缓存数据刷新到主内存中;其他线程进入该代码块时,需要获取monitor对象,会使cpu缓存失效,从而使变量从主内存中重新加载。
需要java学习路线图的私信笔者“java”领取哦!另外喜欢这篇文章的可以给笔者点个赞,关注一下,每天都会分享Java相关文章!还有不定时的福利赠送,包括整理的学习资料,面试题,源码等~~
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
分布式事务解决方案,中间件 Seata 的设计原理详解
作者:张乘辉 前言 在微服务架构体系下,我们可以按照业务模块分层设计,单独部署,减轻了服务部署压力,也解耦了业务的耦合,避免了应用逐渐变成一个庞然怪物,从而可以轻松扩展,在某些服务出现故障时也不会影响其它服务的正常运行。总之,微服务在业务的高速发展中带给我们越来越多的优势,但是微服务并不是十全十美,因此不能盲目过度滥用,它有很多不足,而且会给系统带来一定的复杂度,其中伴随而来的分布式事务问题,是微服务架构体系下必然需要处理的一个痛点,也是业界一直关注的一个领域,因此也出现了诸如 CAP 和 BASE 等理论。在今年年初,阿里开源了一个分布式事务中间件,起初起名为 Fescar,后改名为 Seata,在它开源之初,我就知道它肯定要火,因为这是一个解决痛点的开源项目,Seata 一开始就是冲着对业务无侵入与高性能方向走,这正是我们对解决分布式事务问题迫切的需求。 分布式事务解决的方案有哪些? 目前分布式事务解决的方案主要有对业务无入侵和有入侵的方案,无入侵方案主要有基于数据库 XA 协议的两段式提交(2PC)方案,它的优点是对业务代码无入侵,但是它的缺点也是很明显:必须要求数据库对 XA ...
- 下一篇
我在阿里工作的这段时间里,都学到了哪些东西?
前言: 来阿里也已经四个多月了,这段时间我学了很多东西,简单说起来,就是一个走出舒适区的过程,从一开始的新手入门,到逐渐熟悉业务和技术,再到慢慢的适应环境,胜任工作。 总体来说,这几个月还是学到了很多东西,感觉成长的很快,但同时工作的压力也非常的大。总体来说,归纳几个点吧。 第一点:就是阿里的技术。 大家都知道阿里的iOS技术栈,在业内基本上是可以排第一的,这也归功于阿里的技术发展十分迅速,所以底层的技术才会如此的先进。 阿里内部通常都会自己研发中间件,阿里也开源了一套中间件,但实际上内部又维护了好几套的中间件,蚂蚁也有自己独立的中间件体系,用于支撑蚂蚁金服里所有的业务线和技术线。 其实简单来说,蚂蚁的这些中技术组件和阿里系的中间件、以及开源的一些组件都大同小异,只不过对于金融支付场景更加的适用, 这也是我第一次接触大规模的分布式技术组件,不管是缓存、消息队列、定时任务等各种各样的组件,都会在日常的工作中使用到,所以在技术上的成长,主要还是体现在平时的日常工作中的。 第二点就是:对职场的理解。 在没有正式工作之前,我对职场的理解还停留在实习的阶段,实习相对正式工作来说,比较轻松,生活和...
相关文章
文章评论
共有0条评论来说两句吧...