java char数组 内存空间_透过字节码分析java基本类型数组的内存分配方式。

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

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

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

public classArrayTest {public static voidmain(String[] args) {int[] arr = new int[3];

}

}

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

Compiled from "ArrayTest.java"

public classArrayTest {publicArrayTest();

Code:0: aload_0 //从局部变量0中加载引用到堆栈,即将当前对象引用压入栈。1: invokespecial #8 //调用对象的实例方法,就是初始化方法init, 这里#8表示的是对应在方法池里方法的引用,

4: return

public static voidmain(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 classArrayTest {public static voidmain(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."":()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++中数组是可以在栈中分配空间的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值