标签:总结 十一 操作数 压入 System 内存 JVM 栈中
运行时举例
图解示例
- 代码
1 public class RuntimeDemo { 2 public static void main(String[] args) { 3 int x = 500; 4 int y = 100; 5 int a = x / y; 6 int b = 50; 7 System.out.println(a + b); 8 } 9 }
-
使用javap命令查看变编译字节码查看
-
字节码执行过程展示:初始状态
- 首先将操作数500压入操作数栈中
- 然后操作数 500 从操作数栈中取出,存储到局部变量表中索引为 1 的位置
- 然后操作数 100 从操作数栈中取出,存储到局部变量表中索引为 2 的位置
- 将操作数 100 取出
- 读取本地变量 1 ,压入操作数栈
- 读取本地变量 2 ,压入操作数栈
- 两数相除,计算结果放在操作数栈顶,之后执行 istore_3 指令,将计算结果从操作数栈中弹出,存入局部变量 3 中
- 将操作数 50 压入操作数栈
- 将操作数 50 从栈顶弹出,保存在局部变量 4 中
- 获取 System.out 输出流的引用,通过对应的常量池值
- 将本地变量 3 的值取出,压入操作数栈中,准备进行加法运算
- 执行加法运算后,将计算结果放在操作数栈顶
- 调用静态方法 println() ,输出加法结果
- main() 方法执行结束
关于【符号引用 --> 直接饮用】的理解
-
上面代码调用 System.out.println() 方法时,首先需要看看 System 类有没有加载,再看看 PrintStream 类有没有加载
-
如果没有加载,则执行加载,执行时,将常量池中的符号引用(字面量)转换为直接引用(真正的地址值)
关于程序计数器的说明
程序计数器始终计算的都是当前代码运行的位置,目的是为了方便记录方法调用后能够正常返回,或者是进行了CPU切换后,也能回来到原来的代码进行执行。
运行时数据区总结
-
线程私有结构:程序计数器、虚拟机栈、本地方法栈
-
每个虚拟机栈由由具体的栈帧组成,在栈帧的动态链接中,保存至对方法的引用
-
方法区在 JDK7 之前,使用永久代实现,在 JDK8 之后,使用元空间实现
-
Minor GC 针对于新生区,Major GC 针对于老年区,Full GC 针对于整个堆空间和方法区
大场面试题
- 百度
- 三面:说一下JVM内存模型吧,有哪些区?分别干什么的?
- 蚂蚁金服:
- Java8的内存分代改进
- JVM内存分哪几个区,每个区的作用是什么?
- 一面:JVM内存分布/内存结构?栈和堆的区别?堆的结构?为什么两个survivor区?
- 二面:Eden和survior的比例分配
- 小米:
- jvm内存分区,为什么要有新生代和老年代
- 字节跳动:
- 二面:Java的内存分区
- 二面:讲讲vm运行时数据库区
- 什么时候对象会进入老年代?
- 京东:
- JVM的内存结构,Eden和Survivor比例。
- JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和survivor。
- 天猫:
- 一面:Jvm内存模型以及分区,需要详细到每个区放什么。
- 一面:JVM的内存模型,Java8做了什么改
- 拼多多:
- JVM内存分哪几个区,每个区的作用是什么?
- 美团:
- java内存分配
- jvm的永久代中会发生垃圾回收吗?
- 一面:jvm内存分区,为什么要有新生代和老年代?
标签:总结,十一,操作数,压入,System,内存,JVM,栈中 来源: https://www.cnblogs.com/h--d/p/14190412.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。