我们知道java中new方式创建的对象都是在堆中创建的,而局部变量对应的值存放在栈上。那么java中的int [] arr={1,2,3}是存放在什么地方的呢,int []arr = new int[3]又是存放在什么地方的呢,

下面我们通过编写两个小例子,通过查看生成的字节码文件,来了解jvm会如何来处理这两种情况的。

1.int[] arr = new int[3]示例

public class ArrayTest {public static void main(String[] args) {int[] arr = new int[3];}}

生成的字节码文件如下:这里只显示主要信息。java对应的字节码指令信息请参考博文java 字节码指令

Compiled from "ArrayTest.java"
public class ArrayTest {public ArrayTest();Code:0: aload_0  //从局部变量0中加载引用到堆栈,即将当前对象引用压入栈。1: invokespecial #8       //调用对象的实例方法,就是初始化方法init, 这里#8表示的是对应在方法池里方法的引用,4: returnpublic static void main(java.lang.String[]);Code:0: iconst_3   //将3压入栈。1: newarray       int  //该指令首先从栈中弹出数据3,并创建一个大小为3的整形数组,并将该数组的对象引用(地址)压入栈中。3: astore_1   //将弹出栈中对象引用存放到局部变量1中。4: return
}

2.int arr[] = {1,2,3}示例:

public class ArrayTest {public static void main(String[] args) {//int[] arr = new int[3];int[] arr = {1,2,3};}}

生成的字节码如下:

Compiled from "ArrayTest.java"
public class ArrayTest {public ArrayTest();Code:0: aload_01: invokespecial #8                  // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: iconst_31: newarray       int //同上3: dup     //拷贝一份栈顶的值,并将其压栈,4: iconst_05: iconst_16: iastore //将栈顶的1存放到数组的0索引的位置7: dup8: iconst_19: iconst_210: iastore  //将栈顶2存放到数组的1索引的位置11: dup12: iconst_2 13: iconst_314: iastore //将栈顶3存放到数组2索引的位置。15: astore_116: return
}

通过生成的字节码我们可以看出两种数组的创建都是都过newarr关键字来创建的,jvm会在堆中为其开辟空间,并将数组的引用存放在栈中。

由此可知java中的数组是在堆中分配空间。但是在C,C++中数组是可以在栈中分配空间的。

转载于:https://www.cnblogs.com/justinli/p/array.html

透过字节码分析java基本类型数组的内存分配方式。相关推荐

  1. java中类的字节码_Java 字节码与字节码分析

    1.1 Java 字节码简介Java 字节码由单字节(byte)的指令组成,理论上最多支持 256 个操作码(opcode).实际上 Java 只使用了200左右的操作码, 还有一些操作码则保留给调试 ...

  2. python把桢写入txt_Java 字节码与字节码分析

    1.1 Java 字节码简介Java 字节码由单字节(byte)的指令组成,理论上最多支持 256 个操作码(opcode).实际上 Java 只使用了200左右的操作码, 还有一些操作码则保留给调试 ...

  3. Android Kotlin 学习总结(一) 《KAE 优缺点并且深入字节码分析工作原理》

    本章会分为以下内容: 1.Kotlin KAE介绍,使用和原始Android findViewById对比优缺点 2.Kotlin KAE所存在的问题 3.通过字节码分析他的实现原理 阅读本章内容大概 ...

  4. 深入源码分析Java线程池的实现原理

    转载自   深入源码分析Java线程池的实现原理 程序的运行,其本质上,是对系统资源(CPU.内存.磁盘.网络等等)的使用.如何高效的使用这些资源是我们编程优化演进的一个方向.今天说的线程池就是一种对 ...

  5. Java生产环境下性能监控与调优详解 第8章 JVM字节码与Java代码层调优

    第8章 JVM字节码与Java代码层调优 8-1 jvm字节码指令-1 8-2 jvm字节码指令-2 8-3 i++与++i 8-4 字符串+拼接 8-5 Try-Finally字节码 8-6 Str ...

  6. 从字节码看java中 this 的隐式传参

    从字节码看java中 this 隐式传参具体体现(和python中的self如出一辙,但是比python中藏得更深),也发现了 static 与 非 static 方法的区别所在! static与非s ...

  7. 视频教程-Spring底层源码分析-Java

    Spring底层源码分析 鲁班学院-子路老师曾就职于谷歌.天猫电商等多家互联网公司,历任java架构师.研发经理等职位,参与并主导千万级并发电商网站与后端供应链研发体系搭建,多次参与电商大促活动技术保 ...

  8. 视频教程-RPC服务框架(Dubbo)源码分析-Java

    RPC服务框架(Dubbo)源码分析 鲁班学院-子路老师曾就职于谷歌.天猫电商等多家互联网公司,历任java架构师.研发经理等职位,参与并主导千万级并发电商网站与后端供应链研发体系搭建,多次参与电商大 ...

  9. Java中一维数组的内存解析(浅显易懂,新手必看)

    1.初识JVM 要认识Java中一维数组的内存存储情况,首先应该简单了解一下JVM这个概念 1.1什么是JVM JVM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计 ...

最新文章

  1. 你面试稳了!通关LeetCode刷题完整攻略,省时又高效
  2. 为什么需要MapReduce?
  3. python删除字符串_Python3 - 删除字符串中不需要的字符
  4. 主键能否@onetoone_双向@OneToOne主键关联
  5. Linux Arch目录下处理器体系架构介绍
  6. 被嫌弃的互联网的 “一生”(上)
  7. C#LeetCode刷题之#66-加一(Plus One)
  8. w ndows7如何清理垃圾,windows7系统下在关机时如何自动清理垃圾文件
  9. 【比特熊故事汇】4月MVP英雄故事:微软携手英特尔,特别“投资企划”披露
  10. windows11系统下vone客户端连接服务器失败,请确认网络连接是否正常解决方案
  11. win10防火墙打不开,设置是灰色的、edge闪退、应用商店灰色等问题
  12. autojs读取文字_Auto.js小白详细代码分析教程-如何阅读本文档 - Documentation
  13. 计算机视觉—期刊|会议名称以及出版社对应大全
  14. 【Python小案例】打工人必备:有了这款倒计时神器,再也不用担心自己的隐私被偷窥啦~(附源码)
  15. C#使用Topshelf和Quartz开发处理定时任务的Windows服务程序
  16. 目前大部分的游戏框架_简单的Windows游戏-第1部分:游戏框架
  17. 泰凌微TLSR825X开发八 OTA升级
  18. 笑到爆,产品经理VS大堂经理
  19. DataX安装部署-Reader插件二次开发
  20. 固态硬盘多大合适 php,固态硬盘温度一般多少度

热门文章

  1. DeepMind用ReinforcementLearning玩游戏
  2. python机器学习入门(Day1:Numpy)
  3. springcloud(二):注册中心Eureka
  4. Mac OSX:Powerline风格的zsh配置
  5. phpstorm一个窗口打开多个项目
  6. 分布式文件系统FastDFS架构剖析
  7. 100层楼2个鸡蛋,如何得知鸡蛋能承受几层的撞击
  8. Mysql命令行导入sql数据
  9. 一台路由器实现电信ITV与宽带共享上网
  10. secure使用vi编辑远程机器文件出现4;m