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

JVM整体架构

JVM整体架构如下:

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

public class Math {
public static final Integer CONSTANT = 666; public int compute(){
int a = 1;
int b = 2;
int c = (a + b) * 10;
return c;
} public static void main(String[] args) {
Math math = new Math();
math.compute();
}
}

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

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

得到Math.txt文件

对compute方法进行分析:

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

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

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

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

动态链接

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

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

找到main方法所在的位置

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

其中

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

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

再往上找,找到常量池

找到

#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. redis使用例子

    package test.iafclub.redis; import java.util.ArrayList; import java.util.HashMap; import java.util.I ...

  2. System.Web.HttpRequestValidationException: 从客户端(name="<a href=''>我是晓菜鸟</a>")中检测到有潜在危险的 Request.Form 值

    这是一个比较常见的问题了,如果Web表单中有输入类似于 Html 标签之类的文本,在通过 Request.QueryString 或者 Request.Form 传递这些值的时候,就会触发这样的异常, ...

  3. 一个项目中:只能存在一个 WebMvcConfigurationSupport (添加swagger坑)

    问题再现: 1.添加了swagger配置,导致接口响应的中文乱码 2.于是又添加了配置解决中文乱码的配置: 问题来了,添加了CharsetConfig 配置后swagger的配置失效了,访问404,搞 ...

  4. The websites related Laravel 相关网站(内容将不断更新)

    https://laraveldaily.com/ 文章内容质量很高

  5. java里getPath、 getAbsolutePath、getCanonicalPath的区别

    本文链接:https://blog.csdn.net/wh_19910525/article/details/9314675 File的这三个方法在api中都有说明,仅以程序为例说明. package ...

  6. 「CF716D」Complete The Graph「最短路」

    题意 给定一个\(n\)个点\(m\)条边的无向图,有一些边权暂时为\(0\),你需要分配一个\([1, 10^{18}]\)的数.最终使得\(s\)到\(t\)最短路为\(L\),输出一个可行的分配 ...

  7. sick 激光

    sick10:TiM561-2050101https://www.sick.com/cn/zh/detection-and-ranging-solutions/2d-lidar-/tim5xx/tim ...

  8. c++ 生成容器元素生成随机数

    // random_shuffle example #include <iostream> // cout #include <algorithm> // random_shu ...

  9. 对@repository,@Service, @Compent,@Controller注解的理解

    注解是没什么本质区别,都是声明作用,取不同的名字只是为了更好区分各自的功能. @Repository 用于标注数据访问组件,即DAO组件 @Service 用于标注业务层组件 @Controller ...

  10. go结构体的方法和普通函数

    package main import ( "fmt" "math" ) type vertex struct { X, Y float64 } //值接收者是 ...