我想知道当下面的代码执行时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);
答案 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}
+---+-...
我认为在它变为特定于实现之前,这是最不常见的分母。