首页 > 代码库 > 透过字节码分析java基本类型数组的内存分配方式。
透过字节码分析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: return public 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_0 1: invokespecial #8 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: iconst_3 1: newarray int //同上 3: dup //拷贝一份栈顶的值,并将其压栈, 4: iconst_0 5: iconst_1 6: iastore //将栈顶的1存放到数组的0索引的位置 7: dup 8: iconst_1 9: iconst_2 10: iastore //将栈顶2存放到数组的1索引的位置 11: dup 12: iconst_2 13: iconst_3 14: iastore //将栈顶3存放到数组2索引的位置。 15: astore_1 16: return}
通过生成的字节码我们可以看出两种数组的创建都是都过newarr关键字来创建的,jvm会在堆中为其开辟空间,并将数组的引用存放在栈中。
由此可知java中的数组是在堆中分配空间。但是在C,C++中数组是可以在栈中分配空间的。
透过字节码分析java基本类型数组的内存分配方式。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。