zoukankan      html  css  js  c++  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++中数组是可以在栈中分配空间的。

  • 相关阅读:
    SSL证书的生成方法
    某些系统文件破坏后的修复方式
    dd命令的使用简介
    浅谈访问控制列表(ACL)
    发送端usleep(900)单线程带宽
    1024个读出线程的测试结果
    寻找ROS取数的瓶颈:思路整理(2)
    ROS:32个接收进程的接收带宽
    ROS: 将接收端的接收函数注释掉,TCP只发送,不接受数据时的recv-Q和send-Q长度实验
    ROS:16个接收进程的接收带宽
  • 原文地址:https://www.cnblogs.com/justinli/p/array.html
Copyright © 2011-2022 走看看