我只是想分享一些我在这个主题上运行的测试。
大小为 1000 万的数组
public static void main(String[] args) {
memInfo();
double a[] = new double[10000000];
memInfo();
}
输出:
------------------------
max mem = 130.0 MB
total mem = 85.0 MB
free mem = 83.6 MB
used mem = 1.4 MB
------------------------
------------------------
max mem = 130.0 MB
total mem = 130.0 MB
free mem = 48.9 MB
used mem = 81.1 MB
------------------------
如您所见,使用的堆大小增加了约 80 MB,即 10m * sizeof(double)。
但是如果我们使用 Double 而不是 double
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
memInfo();
}
输出将显示 40MB。我们只有双重引用,它们没有被初始化。
用 Double 填充它
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
Double qq = 3.1d;
for (int i = 0; i < a.length; i++) {
a[i] = qq;
}
memInfo();
}
仍然是 40MB。因为它们都指向同一个 Double 对象。
用 double 代替初始化
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
Double qq = 3.1d;
for (int i = 0; i < a.length; i++) {
a[i] = qq.doubleValue();
}
memInfo();
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
线
a[i] = qq.doubleValue();
等价于
a[i] = Double.valueOf(qq.doubleValue());
相当于
a[i] = new Double(qq.doubleValue());
由于我们每次都创建新的 Double 对象,因此我们会炸毁堆。
这表明 Double 类中的值存储在堆中。