从虚拟机栈的角度看i++和++i

虚拟机栈

  • 虚拟机栈是描述java方法执行过程的内存模型,方法的执行和返回对应着虚拟机栈中的入栈和出栈,保存的是一个一个栈帧,当前栈帧对应着当前执行的方法
  • 栈帧由局部变量表,操作数栈,动态链接,返回地址和一些附加信息组成。
  • 局部变量表:定义为一个数字数组,存放方法参数和定义在方法内的局部变量,这些数据类型包括基本数据类型,返回值,对象引用(reference),容量是在编译期确认下来的,
  • 局部变量表的基本存储单位是槽,slot,32为以内的类型占一个slot,64位的类型占用两个槽(double和long)byte,short和char转变成int,索引为0的位置放置的是this。slot重复利用,当局部变量超过了他的作用域时,就可能会被重用。
  • 操作数栈:操作数栈,在程序执行过程中,根据字节码指令,进行入栈与出栈,比如复制,求和,交换等操作,主要用于保存计算中的中间结果,同时作为计算中变量临时的存储空间。
  • 栈顶缓存技术,将栈顶元素全部缓存在物理cpu的寄存器中,以降低对内存的访问次数,提升执行引擎的效率。
  • 动态链接:即指向运行时常量池方法的引用,引用的目的就是为了支持当前方法的代码能够实现动态链接
  • 方法重写的本质:
  1. 找到操作数栈顶的第一个元素所执行的对象的类型,记为c
  2. 如果在类型c中找到与常量中的描述符合简单名称相同的方法,则进行权限校验,如果通过则返回这个方法的直接应用,不通过则返回illegalaccesserror异常
  3. 否则,按照继承关系从下往上查找父类,继续第二步的搜索方法
  4. 如果始终没有找到,返回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相关推荐

  1. Java JVM 从虚拟机的角度看对象的创建与访问

    专栏原创出处:github-源笔记文件 ,github-源码 ,欢迎 Star,转载请附上原文出处链接和本声明. Java JVM-虚拟机专栏系列笔记,系统性学习可访问个人复盘笔记-技术博客 Java ...

  2. 从软件工程角度看大前端技术栈

    从软件工程角度看大前端技术栈 优秀人才不缺工作机会,只缺适合自己的好机会.但是他们往往没有精力从海量机会中找到最适合的那个. 100offer 会对平台上的人才和企业进行严格筛选,让「最好的人才」和「 ...

  3. 探究Java虚拟机栈

    前言 Java 虚拟机的内存模型分为两部分:一部分是线程共享的,包括 Java 堆和方法区:另一部分是线程私有的,包括虚拟机栈和本地方法栈,以及程序计数器这一小部分内存.今天我就 Java 虚拟机栈做 ...

  4. 从源码角度看Android系统SystemServer进程启动过程

    SystemServer进程是由Zygote进程fork生成,进程名为system_server,主要用于创建系统服务. 备注:本文将结合Android8.0的源码看SystemServer进程的启动 ...

  5. 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区域 ...

  6. 运行时错误7内存溢出_分别从运行时和GC的角度看JAVA8内存管理

    运行时区域 1.程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.在虚拟机概念模型里(概念模型,各种虚拟机 ...

  7. java的标量和聚合量_JVM 角度看代码优化

    从JVM角度看,有这几种优化手段: 栈上分配: 把对上分配对象空间的行为转化成栈上分配,减少YGC,提供性能 同步省略 同步代码块锁消除 标量替换 为栈上分配提供了基础,和栈上分配时搭配做的 这几个优 ...

  8. 详解Java虚拟机栈

    目录 简介 运行时栈帧结构 局部变量表 操作数栈 动态连接 方法返回地址 简介 由于跨平台性的设计,Java 的指令都是根据栈来设计的.不同平台 CPU 架构不同,所以不能设计为基于寄存器的. 优点是 ...

  9. 一个函数的自白:从函数的角度看编程的方式

    以下内容转载自 https://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=2651002566&idx=1&sn=76b652 ...

最新文章

  1. 【ACM】UVa 1339
  2. Mysql Router 读写分离配置
  3. mate40能更新鸿蒙,Mate40领衔更新!鸿蒙系统首批升级机型名单:这些机型可坐等推送...
  4. 答答租车系统(面向对象综合练习)_JAVA
  5. 判别式和产生式的区别
  6. hp-ux修改时区方法_UX研究人员可以倡导人类的6种方法
  7. 解决:single failed: For artifact {null:null:null:jar}: The groupId cannot be empty. 把工程依赖的jar包打到入jar中
  8. Git—基础知识及常用命令(系列一)
  9. 资源放送丨《容灾体系建设之“独孤九式”》PPT视频
  10. 【汇编】汇编程序入门篇
  11. linux命令快速手记 — 让手指跟上思考的速度(四)
  12. 针对github权限导致hexo部署失败的解决方案
  13. Emacs快捷键的总结
  14. paip.python错误解决17
  15. Android反编译 for Mac
  16. 探索:区块链视频流媒体平台
  17. c语言什么意思 app 视频 新闻 视,C语言中csapp.h 是什么意思?
  18. 八大地图API开发平台大比拼
  19. 数据库上机实验三(游标)
  20. 本人新书上市 《分布式系统与一致性》

热门文章

  1. 淘宝sdk模板制作所需的部分资料(个人常用)
  2. Java 中的加密算法: AES
  3. 使用Unity制作的一个望远镜特效,在狙击手游戏中很常见
  4. 懒癌患者的学习记录之JAVA简单选择排序
  5. 聚观早报 | 苹果市值跌破2万亿美元大关;卢伟冰晋升小米集团总裁
  6. 人本是人 不必刻意去做人 世本是世 无须精心去处世
  7. 倡议书——传递爱心,春暖医芳
  8. 工作一个月的心得体会
  9. html5页面上播放直播,映客、花椒的h5直播播放页面技术选择
  10. 2017河北单招计算机试题,2017河北单招语文模拟试题一(附答案).docx