参考地址:https://www.zhihu.com/question/24747160

问:int a = 3; 首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址?
      是不是说要建立一个字面值为3的内存,再建立一个指向3的地址?就是要建立2个内存?

答:

  1. public void foo() {
  2. int i = 100000000;
  3. int j = 1;
  4. Bar b = new Bar();
  5. }

上面代码编译成class文件之后

  1. public void foo();
  2. flags: ACC_PUBLIC
  3. Code:
  4. stack=2, locals=4, args_size=1
  5. 0: ldc #15 // int 100000000
  6. 2: istore_1
  7. 3: iconst_1
  8. 4: istore_2
  9. 5: new #1 // class Bar
  10. 8: dup
  11. 9: invokespecial #16 // Method "<init>":()V
  12. 12: astore_3
  13. 13: return
  14. LineNumberTable:
  15. line 3: 0
  16. line 4: 3
  17. line 5: 5
  18. line 6: 13
  19. LocalVariableTable:
  20. Start Length Slot Name Signature
  21. 0 14 0 this LBar;
  22. 3 11 1 i I
  23. 5 9 2 j I
  24. 13 1 3 b LBar;

栈深度为2 本地变量表为4(对象方法对this的引用 存储i和j需要的地址 存储Bar用的地址)
由于我代码中是写死的字面常量100000000 所以有个ldc命令去常量池里读了

  1. #15 = Integer 100000000

这个常量 然后调用store命令存入了本地变量表的第Name为1的位置
然后后边的int j = 1; 直接调用了iconst_1(这个1都没有存到类的常量池里..)获取了值为1的常量 然后存储到了Name为2的位置
然后Bar对象是引用类型 所以是LBar
例子并不全 你可以自己加一些代码 比如你加一个 int h = i + j;
你就会发现他通过iload命令读取加载变量表中指定位置的值到栈中 然后调用iadd自动从栈中弹出两个之前加载的int值进行计算 栈深度其实就是指他一次能加载多少变量到栈

这个不容易理解,找本虚拟机的书 了解下基本指令 然后对照自己的class文件 就明白了

java基本数据类型在栈中怎么存放的?的更多相关文章

  1. java引用数据类型在方法中的值传递

    package org.jimmy.autosearch20180821.test; public class TestStringArr { public static void main(Stri ...

  2. java基础编程——获取栈中的最小元素

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)).   题目代码 /** * Created by YuKai Fan on 2018/9 ...

  3. JAVA中用堆和栈的概念来理解equals() "=="和hashcode()

    在学习java基本数据类型和复杂数据类型的时候,特别是equals()"=="和hashcode()部分时,不是很懂,也停留了很长时间,最后终于有点眉目了. 要理解equals() ...

  4. JAVA的堆于栈

    1. 栈(stack)与堆(heap):都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势:存取速度比堆要快,仅次于直接位于C ...

  5. java的堆,栈,静态代码区 详解

    面试中,有家公司做数据库开发的,对内存要求比较高,考到了这个 一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方— ...

  6. Java虚拟机堆和栈详细解析,以后面试再也不怕问jvm了!

    堆 Java堆是和Java应用程序关系最密切的内存空间,几乎所有的对象都放在其中,并且Java堆完全是自动化管理,通过垃圾收集机制,垃圾对象会自动清理,不需自己去释放. 根据垃圾回收机制的不同,Jav ...

  7. (转)java内存分配分析/栈内存、堆内存

    转自(http://blog.csdn.net/qh_java/article/details/9084091) java内存分配分析/栈内存.堆内存 java内存分配分析 本文将由浅入深详细介绍Ja ...

  8. java中的基本数据类型一定存储在栈中吗?

    首先说明,"java中的基本数据类型一定存储在栈中的吗?”这句话肯定是错误的. 下面让我们一起来分析一下原因: 基本数据类型是放在栈中还是放在堆中,这取决于基本类型在何处声明,下面对数据类型 ...

  9. java中的各种数据类型在内存中存储的方式

    原文地址:http://blog.csdn.net/aaa1117a8w5s6d/article/details/8251456 1.Java是如何管理内存的 java的内存管理就是对象的分配和释放问 ...

随机推荐

  1. LiberOJ #6210. 「美团 CodeM 决赛」tree 树形DP

    题目链接:点这里 题解: 需要证明,所求的路径一定是全部权值都为1或者,路径上权值至多有一个为2其余为1且权值2在路径中央. 然后树形DP 设定dp[i][0/1] 以1为根的情况下,以i 节点下子树 ...

  2. 实用API大全

    有道翻译API http://fanyi.youdao.com/openapi 有道翻译API支持中英互译,同时获得有道翻译结果和有道词典结果(可能没有),返回格式为XML或JSON.   百度翻译A ...

  3. PPAPI与Browser间使用AsyncIPC通信

    採用AsyncIpc这个项目(https://github.com/hicdre/AsyncIpc).来完毕PPAPI Plugin进程与Browser进程的通信. foruok原创.如需转载请关注f ...

  4. mysql优化-----多列索引的左前缀规则

    索引优化策略 :索引类型 .1B-tree索引 关注的是:Btree索引的左前缀匹配规则,索引在排序和分组上发挥的作用. 注:名叫btree索引,大的方面看都用的二叉树.平衡树.但具体的实现上,各引擎 ...

  5. js遍历map

    //火狐控制台打印输出: Object { fileNumber="文件编号", fileName="文件名称"} console.log(map); for( ...

  6. (C)*p++和*++p区别

    接下来,通过示例彻底理解自增运算符的两种用法(自减的用法与之类似,只不过是加1变成了减1). 1.++i和i++的区别 如清单1(注意代码中的注释): #include <stdio.h> ...

  7. POJ3126 Prime Path —— BFS + 素数表

    题目链接:http://poj.org/problem?id=3126 Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  8. 内部类 final变量的生命周期

    (1).内部类是外部类的一个成员,就像外部类的成员方法一样,所以内部类有权限访问外部类的所有成员,包括private的. (2).内部类不能访问外部类方法中的局部变量,除非变量是final的(一般发生 ...

  9. Filter的基本配置

    1.<dispatcher></dispatcher>节点:指定过滤器所拦截的servlet容器调用资源的方式,有REQUEST,INCLUDE,FORWARD,ERROR,默 ...

  10. 【转】Darwin Streaming Server 核心代码分析

    无意中看到了dqzhangp的一篇博客,分析了DSS的核心架构,读完顿时感觉豁然开朗,茅塞顿开,写得非常的鞭辟入里,言简意赅,我想没有相当的功力是写不出这样的文章的,情不自禁转到自己空间来,生怕弄丢了 ...