深入剖析Java虚拟机内存模型

JVM整体架构

JVM整体架构如下:

通过编写代码来分析整个内存区域

  1. public class Math {
  2. public static final Integer CONSTANT = 666;
  3. public int compute(){
  4. int a = 1;
  5. int b = 2;
  6. int c = (a + b) * 10;
  7. return c;
  8. }
  9. public static void main(String[] args) {
  10. Math math = new Math();
  11. math.compute();
  12. }
  13. }

对上述代码的class文件进行javap - c Math.class > Math.txt

javap -c是对代码进行反汇编

得到Math.txt文件

对compute方法进行分析:

  1. public int compute();
  2. Code:
  3. 0: iconst_1 //  将int型(1)推送至栈顶
  4. 1: istore_1 //  将栈顶int型数值存入第二个本地变量
  5. 2: iconst_2 //  将int型(2)推送至栈顶
  6. 3: istore_2 //  将栈顶int型数值存入第三个本地变量
  7. 4: iload_1 // 将第二个int型本地变量推送至栈顶
  8. 5: iload_2 // 将第三个int型本地变量推送至栈顶
  9. 6: iadd // 将栈顶两int型数值相加并将结果压入栈顶
  10. 7: bipush 10 // 将单字节的常量值(-128~127)推送至栈顶
  11. 9: imul // 将栈顶两int型数值相乘并将结果压入栈顶
  12. 10: istore_3 // 将栈顶int型数值存入第四个本地变量
  13. 11: iload_3 // 将第四个int型本地变量推送至栈顶
  14. 12: ireturn

上面程序,在JVM中的运行时区域如下:

操作的操作暂时的数据存放到操作数栈

main()的局部变量表存放对象的引用地址。

动态链接

动态链接就是当我们这个程序运行main方法时,当执行math对象额compute方法时,去compute方法执行,compute方法算是符号引用,找到符号引用所在的方法体,执行。

执行javap -v Math.class > Math.txt得到字节码文件

找到main方法所在的位置

  1. public static void main(java.lang.String[]);
  2. descriptor: ([Ljava/lang/String;)V
  3. flags: ACC_PUBLIC, ACC_STATIC
  4. Code:
  5. stack=2, locals=2, args_size=1
  6. 0: new #2 // class com/tugohost/jvm/Math
  7. 3: dup
  8. 4: invokespecial #3 // Method "<init>":()V
  9. 7: astore_1
  10. 8: aload_1
  11. 9: invokevirtual #4 // Method compute:()I
  12. 12: pop
  13. 13: return
  14. LineNumberTable:
  15. line 17: 0
  16. line 18: 8
  17. line 19: 13
  18. LocalVariableTable:
  19. Start Length Slot Name Signature
  20. 0 14 0 args [Ljava/lang/String;
  21. 8 6 1 math Lcom/tugohost/jvm/Math;

其中

9: invokevirtual #4 // Method compute:()I

这一行表示,main函数中的math对象调用compute方法,

再往上找,找到常量池

找到

  1. #4 = Methodref #2.#33 // com/tugohost/jvm/Math.compute:()I

再找#2#33

2 = Class #32 // com/tugohost/jvm/Math

3 = Methodref #2.#31 // com/tugohost/jvm/Math.""

深入剖析Java虚拟机内存结构的更多相关文章

  1. JVM基础系列第6讲:Java 虚拟机内存结构

    看到这里,我相信大家对于一个 Java 源文件是如何变成字节码文件,以及字节码文件的含义已经非常清楚了.那么接下来就是让 Java 虚拟机运行字节码文件,从而得出我们最终想要的结果了.在这个过程中,J ...

  2. 从一道面试题深入了解java虚拟机内存结构

    记得刚大学毕业时,为了应付面试,疯狂的在网上刷JAVA的面试题,很多都靠死记硬背.其中有道面试题,给我的印象非常之深刻,有个大厂的面试官,顺着这道题目,一直往下问,问到java虚拟机的知识,最后把我给 ...

  3. Java程序猿从笨鸟到菜鸟之(九十二)深入java虚拟机(一)——java虚拟机底层结构具体解释

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在曾经的博客里面,我们介绍了在java领域中大部分的知识点,从最基础的java最基本的语法 ...

  4. 翻译Java虚拟机的结构

    英文原版:  https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html 直接谷歌翻译: Java SE规范 > Java虚拟机 ...

  5. JAVA 对象内存结构

    JAVA对象内存结构 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 对象头 markWo ...

  6. Synchronized加锁、锁升级和java对象内存结构

    首先了解一下JMM中定义的内存操作: 一个线程操作数据时候都是从主内存(堆内存)读取到自己工作内存(线程私有的数据区域)中再进行操作.对于硬件内存来说,并没有工作内存和主内存的区分,这都是java内存 ...

  7. Java虚拟机内存模型及垃圾回收监控调优

    Java虚拟机内存模型及垃圾回收监控调优 如果你想理解Java垃圾回收如果工作,那么理解JVM的内存模型就显的非常重要.今天我们就来看看JVM内存的各不同部分及如果监控和实现垃圾回收调优. JVM内存 ...

  8. 如何设置Java虚拟机内存以适应大程序的装载

    Java虚拟机对于运行时的程序所占内存是有限制的,当我们的项目或者程序很大时,往往会照成内存溢出. 举个例子: public class SmallTest1 { public static void ...

  9. 打包apk java 虚拟机内存不足

    解决方案:在android->sdk->build-tools-android-version 中有个 dx.bat dx.bat --dex 命令的dx.bat脚本有这样一句代码 REM ...

随机推荐

  1. 一个奇怪的方法解决华为ENSP模拟器路由器启动后命令行一直“#”的问题

    今天打开ensp准备练习一下,设备启动以后发现端口一直是红色.于是打开路由器命令行,发现一直输出“#”号.百度后几乎试了所有方法,什么删除网卡再新建.重启计时器.配置ip地址..都不行. 可是我昨天用 ...

  2. 2、Spring Boot 2.x 快速入门

    1.2 Spring Boot 快速入门 1.2.1 开发环境和工具 JDK 1.8+:Spring Boot 2.x 要求 JDK 1.8 环境及以上版本.另外,Spring Boot 2.x 只兼 ...

  3. luogu 5354 [Ynoi2017]由乃的OJ LCT+位运算

    如果做过起床困难综合征的话应该很快就能有思路,没做过那道题的话还真是挺费劲的. 我们不知道要带入的值是什么,但是我们可以知道假设带入值得当前位为 $1$ 时这一位在经过位运算后是否为 $1$. 至于这 ...

  4. Bzoj 3942: [Usaco2015 Feb]Censoring(kmp)

    3942: [Usaco2015 Feb]Censoring Description Farmer John has purchased a subscription to Good Hooveske ...

  5. 以下是Direct 3d的安装步骤

    安装配置 真的是软肋 o( ̄ε ̄*)   我记录以下 步骤 防止下次忘记了 首先要安装到direct3d 之后在vs上配置  如下: 找到 安装direct3d的文件夹 复制路径(如下 我的路径为 G ...

  6. 做uart 实验时,run configure 只能选择jtag_uart 而没有uart

    使用的是nios ii 13 版本.直接在nios 软件上运行时程序能够执行,其中已经配置了stdin stderr stdout为jtag_uart.run configure 里面的byte st ...

  7. 2018CCPCFINAL B Balance of the Force 枚举最大值

    题意 n个人能选择黑暗面和光明面,选择两个面分别能获得\(L_i\)和\(R_i\)的力量,有m对人不能选择同一面,问n个人的力量中的最大值-最小值尽可能小为多少. \(1<=n<=2\t ...

  8. ROS indigo下Kinect v2的驱动安装与调试

    ROS indigo下Kinect v2的驱动安装与调试 一.libfreenect2源码安装与测试 github地址:https://github.com/OpenKinect/libfreenec ...

  9. ReactiveCocoa实践

    1.按钮addTarget [[self.aDepositBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNe ...

  10. Java并发指南13:Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析

    Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析 转自https://www.javadoop.com/post/hashmap#toc7 部分内容转自 http: ...