透过字节码分析java基本类型数组的内存分配方式。
我们知道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基本类型数组的内存分配方式。相关推荐
- java中类的字节码_Java 字节码与字节码分析
1.1 Java 字节码简介Java 字节码由单字节(byte)的指令组成,理论上最多支持 256 个操作码(opcode).实际上 Java 只使用了200左右的操作码, 还有一些操作码则保留给调试 ...
- python把桢写入txt_Java 字节码与字节码分析
1.1 Java 字节码简介Java 字节码由单字节(byte)的指令组成,理论上最多支持 256 个操作码(opcode).实际上 Java 只使用了200左右的操作码, 还有一些操作码则保留给调试 ...
- Android Kotlin 学习总结(一) 《KAE 优缺点并且深入字节码分析工作原理》
本章会分为以下内容: 1.Kotlin KAE介绍,使用和原始Android findViewById对比优缺点 2.Kotlin KAE所存在的问题 3.通过字节码分析他的实现原理 阅读本章内容大概 ...
- 深入源码分析Java线程池的实现原理
转载自 深入源码分析Java线程池的实现原理 程序的运行,其本质上,是对系统资源(CPU.内存.磁盘.网络等等)的使用.如何高效的使用这些资源是我们编程优化演进的一个方向.今天说的线程池就是一种对 ...
- 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 ...
- 从字节码看java中 this 的隐式传参
从字节码看java中 this 隐式传参具体体现(和python中的self如出一辙,但是比python中藏得更深),也发现了 static 与 非 static 方法的区别所在! static与非s ...
- 视频教程-Spring底层源码分析-Java
Spring底层源码分析 鲁班学院-子路老师曾就职于谷歌.天猫电商等多家互联网公司,历任java架构师.研发经理等职位,参与并主导千万级并发电商网站与后端供应链研发体系搭建,多次参与电商大促活动技术保 ...
- 视频教程-RPC服务框架(Dubbo)源码分析-Java
RPC服务框架(Dubbo)源码分析 鲁班学院-子路老师曾就职于谷歌.天猫电商等多家互联网公司,历任java架构师.研发经理等职位,参与并主导千万级并发电商网站与后端供应链研发体系搭建,多次参与电商大 ...
- Java中一维数组的内存解析(浅显易懂,新手必看)
1.初识JVM 要认识Java中一维数组的内存存储情况,首先应该简单了解一下JVM这个概念 1.1什么是JVM JVM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计 ...
最新文章
- 你面试稳了!通关LeetCode刷题完整攻略,省时又高效
- 为什么需要MapReduce?
- python删除字符串_Python3 - 删除字符串中不需要的字符
- 主键能否@onetoone_双向@OneToOne主键关联
- Linux Arch目录下处理器体系架构介绍
- 被嫌弃的互联网的 “一生”(上)
- C#LeetCode刷题之#66-加一(Plus One)
- w ndows7如何清理垃圾,windows7系统下在关机时如何自动清理垃圾文件
- 【比特熊故事汇】4月MVP英雄故事:微软携手英特尔,特别“投资企划”披露
- windows11系统下vone客户端连接服务器失败,请确认网络连接是否正常解决方案
- win10防火墙打不开,设置是灰色的、edge闪退、应用商店灰色等问题
- autojs读取文字_Auto.js小白详细代码分析教程-如何阅读本文档 - Documentation
- 计算机视觉—期刊|会议名称以及出版社对应大全
- 【Python小案例】打工人必备:有了这款倒计时神器,再也不用担心自己的隐私被偷窥啦~(附源码)
- C#使用Topshelf和Quartz开发处理定时任务的Windows服务程序
- 目前大部分的游戏框架_简单的Windows游戏-第1部分:游戏框架
- 泰凌微TLSR825X开发八 OTA升级
- 笑到爆,产品经理VS大堂经理
- DataX安装部署-Reader插件二次开发
- 固态硬盘多大合适 php,固态硬盘温度一般多少度