当我们在java中创建数组列表时,内存分配如何在堆中形成?

时间:2014-09-21 19:50:59

标签: java arrays memory

我想知道当下面的代码执行时JVM如何形成内存分配。在编译时内存会发生什么,在执行时会发生什么等等(如果您的答案是参考java内存模型或可能是视觉效果,那将会很好) 提前谢谢

PS。这个问题不是list of arrays in java

    List<int[]> arList = new ArrayList<>();

    arList.add(new int[]{1,2});
    arList.add(new int[]{1,2,3,4});

    int n = (int)Math.random()*10;
    int [] a = new int[n];
    arList.add(a);

2 个答案:

答案 0 :(得分:1)

ArrayList和所有3个int数组都以(或多或少)正常方式在堆中创建(至少只要JITC不进行堆栈分配 - 它永远不会为非 - 循环main方法)。

import java.util.*;
public class IntArrays {
    public static void main(String[] args) {
        List<int[]> arList = new ArrayList<>();

        arList.add(new int[]{1,2});
        arList.add(new int[]{1,2,3,4});

        int n = (int)Math.random()*10;
        int [] a = new int[n];
        arList.add(a);
    }
}

反汇编:

C:\JavaTools>javap -c IntArrays.class
Compiled from "IntArrays.java"
public class IntArrays {
  public IntArrays();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":
()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class java/util/ArrayList
       3: dup
       4: invokespecial #3                  // Method java/util/ArrayList."<init
>":()V
       7: astore_1
       8: aload_1
       9: iconst_2
      10: newarray       int  <<< Create the first array
      12: dup
      13: iconst_0
      14: iconst_1
      15: iastore
      16: dup
      17: iconst_1
      18: iconst_2
      19: iastore
      20: invokeinterface #4,  2            // InterfaceMethod java/util/List.ad
d:(Ljava/lang/Object;)Z
      25: pop
      26: aload_1
      27: iconst_4
      28: newarray       int  <<< Create the second array
      30: dup
      31: iconst_0
      32: iconst_1
      33: iastore
      34: dup
      35: iconst_1
      36: iconst_2
      37: iastore
      38: dup
      39: iconst_2
      40: iconst_3
      41: iastore
      42: dup
      43: iconst_3
      44: iconst_4
      45: iastore
      46: invokeinterface #4,  2            // InterfaceMethod java/util/List.ad
d:(Ljava/lang/Object;)Z
      51: pop
      52: invokestatic  #5                  // Method java/lang/Math.random:()D
      55: d2i
      56: bipush        10
      58: imul
      59: istore_2
      60: iload_2
      61: newarray       int  <<< Create the 3rd array
      63: astore_3
      64: aload_1
      65: aload_3
      66: invokeinterface #4,  2            // InterfaceMethod java/util/List.ad
d:(Ljava/lang/Object;)Z
      71: pop
      72: return
}

未知的是ArrayList内部创建了多少个对象。在最简单的情况下,会有一个Object数组(这是我在JDK 6源代码的副本中看到的),但是没有什么可以防止实现使用某种链接列表,每个元素都是单独的对象,或其他一些方案。

答案 1 :(得分:0)

只需添加“视觉效果”。这就是我刚才在JCP准备课上教授的更抽象的课程。 (好吧,不是完全那个。但是......)

runtime stack
+---+
| a | --------------------------------------+
+---+                                       |
+---+                                       |
| n |                                       |
+---+                                       |
+--------+                                  |
| arList | --+                              |
+--------+   |                              |
             |                              |
             |       runtime heap           |
             v                              |
       +-----------+     +-------+          |
       | ArrayList | --> | 1 | 2 |          |
       +-----------+     +-------+          |
          |    |       +---------------+    |
          |    +-----> | 1 | 2 | 3 | 4 |    |
          |            +---------------+    v
          |                               +---+-...
          +-----------------------------> | 0 | {n times}
                                          +---+-...

我认为在它变为特定于实现之前,这是最不常见的分母。