java基本数据类型在栈中怎么存放的?
参考地址:https://www.zhihu.com/question/24747160
问:int a = 3; 首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址?
      是不是说要建立一个字面值为3的内存,再建立一个指向3的地址?就是要建立2个内存?
	public void foo() {
		int i = 100000000;
		int j = 1;
		Bar b = new Bar();
	}
上面代码编译成class文件之后
  public void foo();
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=4, args_size=1
         0: ldc           #15                 // int 100000000
         2: istore_1
         3: iconst_1
         4: istore_2
         5: new           #1                  // class Bar
         8: dup
         9: invokespecial #16                 // Method "<init>":()V
        12: astore_3
        13: return
      LineNumberTable:
        line 3: 0
        line 4: 3
        line 5: 5
        line 6: 13
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0      14     0  this   LBar;
               3      11     1     i   I
               5       9     2     j   I
              13       1     3     b   LBar;
栈深度为2 本地变量表为4(对象方法对this的引用 存储i和j需要的地址 存储Bar用的地址)
由于我代码中是写死的字面常量100000000 所以有个ldc命令去常量池里读了
#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基本数据类型在栈中怎么存放的?的更多相关文章
- java引用数据类型在方法中的值传递
		package org.jimmy.autosearch20180821.test; public class TestStringArr { public static void main(Stri ... 
- java基础编程——获取栈中的最小元素
		题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 题目代码 /** * Created by YuKai Fan on 2018/9 ... 
- JAVA中用堆和栈的概念来理解equals() "=="和hashcode()
		在学习java基本数据类型和复杂数据类型的时候,特别是equals()"=="和hashcode()部分时,不是很懂,也停留了很长时间,最后终于有点眉目了. 要理解equals() ... 
- JAVA的堆于栈
		1. 栈(stack)与堆(heap):都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势:存取速度比堆要快,仅次于直接位于C ... 
- java的堆,栈,静态代码区 详解
		面试中,有家公司做数据库开发的,对内存要求比较高,考到了这个 一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方— ... 
- Java虚拟机堆和栈详细解析,以后面试再也不怕问jvm了!
		堆 Java堆是和Java应用程序关系最密切的内存空间,几乎所有的对象都放在其中,并且Java堆完全是自动化管理,通过垃圾收集机制,垃圾对象会自动清理,不需自己去释放. 根据垃圾回收机制的不同,Jav ... 
- (转)java内存分配分析/栈内存、堆内存
		转自(http://blog.csdn.net/qh_java/article/details/9084091) java内存分配分析/栈内存.堆内存 java内存分配分析 本文将由浅入深详细介绍Ja ... 
- java中的基本数据类型一定存储在栈中吗?
		首先说明,"java中的基本数据类型一定存储在栈中的吗?”这句话肯定是错误的. 下面让我们一起来分析一下原因: 基本数据类型是放在栈中还是放在堆中,这取决于基本类型在何处声明,下面对数据类型 ... 
- java中的各种数据类型在内存中存储的方式
		原文地址:http://blog.csdn.net/aaa1117a8w5s6d/article/details/8251456 1.Java是如何管理内存的 java的内存管理就是对象的分配和释放问 ... 
随机推荐
- Axure Base 02
			(二)Axure rp的线框图元件 l 图片 图片元件拖入编辑区后,可以通过双击选择本地磁盘中的图片,将图片载入到编辑区,axure会自动提示将大图片进行优化,以避免原型文件过大:选择图片时可以选择 ... 
- HashTable HashMap区分
			主要是安全.速度: 1.HashMap可以接受null的键. 2.HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多 ... 
- eclipse本地覆盖版本库
			1,右键team,与资源库同步 2,选中冲突文件,右键“更新”,此时本地代码出现冲突 3,选中冲突文件,右键点击“标记为解决”,勾选第二项,以本地版本为准 4,冲突被解决,正常提交本地代码 
- 第六届蓝桥杯C++B组省赛
			1.奖券数目 2.星系炸弹 3.三羊献瑞 4.格子中输出 5.九数组分数 6.加法变乘法 7.牌型种数 8.移动距离 9.垒骰子 10.生命之树 1.奖券数目 奖券数目有些人很迷信数字,比如带“4”的 ... 
- sublime text 3 安装vue 语法插件
			1.下载https://github.com/vuejs/vue-syntax-highlight,点击这里也可以下载压缩包 2.解压到C:\Users\***\AppData\Roaming\Sub ... 
- 【POJ 2406】 Power Strings
			[题目链接] 点击打开链接 [算法] KMP 如果字符串中存在循环节,则next[len] = (循环节个数 - 1) * 循环节长度 循环节个数 = len / (len - next[len]) ... 
- 【转】git修改文件后,提交到远程仓库
			原文地址:https://blog.csdn.net/nly19900820/article/details/73613654 修改文件后,怎么提交到远程仓库1.git status 查看git是否有 ... 
- py-day15_css+js_初
			css+js_初 一.鼠标移动变色 <!DOCTYPE html> <html lang="en"> <head> <meta chars ... 
- jsp实现文件上传(二)用cos组件实现文件上传
			jsp表单 <%@ page language="java" pageEncoding="utf-8"%> <html> <hea ... 
- C. Vanya and Scales
			time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ... 
