## 从虚拟机栈的角度看i++和++i
从虚拟机栈的角度看i++和++i
虚拟机栈
- 虚拟机栈是描述java方法执行过程的内存模型,方法的执行和返回对应着虚拟机栈中的入栈和出栈,保存的是一个一个栈帧,当前栈帧对应着当前执行的方法
- 栈帧由局部变量表,操作数栈,动态链接,返回地址和一些附加信息组成。
- 局部变量表:定义为一个数字数组,存放方法参数和定义在方法内的局部变量,这些数据类型包括基本数据类型,返回值,对象引用(reference),容量是在编译期确认下来的,
- 局部变量表的基本存储单位是槽,slot,32为以内的类型占一个slot,64位的类型占用两个槽(double和long)byte,short和char转变成int,索引为0的位置放置的是this。slot重复利用,当局部变量超过了他的作用域时,就可能会被重用。
- 操作数栈:操作数栈,在程序执行过程中,根据字节码指令,进行入栈与出栈,比如复制,求和,交换等操作,主要用于保存计算中的中间结果,同时作为计算中变量临时的存储空间。
- 栈顶缓存技术,将栈顶元素全部缓存在物理cpu的寄存器中,以降低对内存的访问次数,提升执行引擎的效率。
- 动态链接:即指向运行时常量池方法的引用,引用的目的就是为了支持当前方法的代码能够实现动态链接
- 方法重写的本质:
- 找到操作数栈顶的第一个元素所执行的对象的类型,记为c
- 如果在类型c中找到与常量中的描述符合简单名称相同的方法,则进行权限校验,如果通过则返回这个方法的直接应用,不通过则返回illegalaccesserror异常
- 否则,按照继承关系从下往上查找父类,继续第二步的搜索方法
- 如果始终没有找到,返回abstracmethoderror异常
- 方法返回地址:存放pc寄存器的值,让程序继续进行下去
好,讲了那么多,我们回归主题,怎么看待i++和++i呢,先加和后加如何理解呢?
int i = 1;
i = i++;
i = ++i;
来看一段简单的代码,上下两个i一个是1;一个是2,要理解这个问题,需要通过局部变量表和操作数栈和字节码指令来理解。
int i = 1,把 1 存入局部变量表,i = i++, 先将1 入栈,然后局部变量表的i自加,变成2,然后操作数栈出栈给局部变量表,i又变成1
i = ++i, 先把局部变量表的i自加,变成2,然后2入栈,在出栈给局部变量表,i=2.
## 从虚拟机栈的角度看i++和++i相关推荐
- Java JVM 从虚拟机的角度看对象的创建与访问
专栏原创出处:github-源笔记文件 ,github-源码 ,欢迎 Star,转载请附上原文出处链接和本声明. Java JVM-虚拟机专栏系列笔记,系统性学习可访问个人复盘笔记-技术博客 Java ...
- 从软件工程角度看大前端技术栈
从软件工程角度看大前端技术栈 优秀人才不缺工作机会,只缺适合自己的好机会.但是他们往往没有精力从海量机会中找到最适合的那个. 100offer 会对平台上的人才和企业进行严格筛选,让「最好的人才」和「 ...
- 探究Java虚拟机栈
前言 Java 虚拟机的内存模型分为两部分:一部分是线程共享的,包括 Java 堆和方法区:另一部分是线程私有的,包括虚拟机栈和本地方法栈,以及程序计数器这一小部分内存.今天我就 Java 虚拟机栈做 ...
- 从源码角度看Android系统SystemServer进程启动过程
SystemServer进程是由Zygote进程fork生成,进程名为system_server,主要用于创建系统服务. 备注:本文将结合Android8.0的源码看SystemServer进程的启动 ...
- 1、虚拟机内存管理、运行时数据区、线程共享区、Java堆、新生代、老年代、Eden区域分配、方法区、线程独占区、虚拟机栈
1.Java虚拟机内存管理 1.1.运行时数据区[Runtime Data Area] 1.1.1.线程共享区 1.1.1.1.Java堆[heap] 1.1.1.1.1.新生代.老年代.Eden区域 ...
- 运行时错误7内存溢出_分别从运行时和GC的角度看JAVA8内存管理
运行时区域 1.程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.在虚拟机概念模型里(概念模型,各种虚拟机 ...
- java的标量和聚合量_JVM 角度看代码优化
从JVM角度看,有这几种优化手段: 栈上分配: 把对上分配对象空间的行为转化成栈上分配,减少YGC,提供性能 同步省略 同步代码块锁消除 标量替换 为栈上分配提供了基础,和栈上分配时搭配做的 这几个优 ...
- 详解Java虚拟机栈
目录 简介 运行时栈帧结构 局部变量表 操作数栈 动态连接 方法返回地址 简介 由于跨平台性的设计,Java 的指令都是根据栈来设计的.不同平台 CPU 架构不同,所以不能设计为基于寄存器的. 优点是 ...
- 一个函数的自白:从函数的角度看编程的方式
以下内容转载自 https://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=2651002566&idx=1&sn=76b652 ...
最新文章
- 【ACM】UVa 1339
- Mysql Router 读写分离配置
- mate40能更新鸿蒙,Mate40领衔更新!鸿蒙系统首批升级机型名单:这些机型可坐等推送...
- 答答租车系统(面向对象综合练习)_JAVA
- 判别式和产生式的区别
- hp-ux修改时区方法_UX研究人员可以倡导人类的6种方法
- 解决:single failed: For artifact {null:null:null:jar}: The groupId cannot be empty. 把工程依赖的jar包打到入jar中
- Git—基础知识及常用命令(系列一)
- 资源放送丨《容灾体系建设之“独孤九式”》PPT视频
- 【汇编】汇编程序入门篇
- linux命令快速手记 — 让手指跟上思考的速度(四)
- 针对github权限导致hexo部署失败的解决方案
- Emacs快捷键的总结
- paip.python错误解决17
- Android反编译 for Mac
- 探索:区块链视频流媒体平台
- c语言什么意思 app 视频 新闻 视,C语言中csapp.h 是什么意思?
- 八大地图API开发平台大比拼
- 数据库上机实验三(游标)
- 本人新书上市 《分布式系统与一致性》