我真的希望我的标题是正确的,但让我准确解释一下标题的含义。
我需要编写一个程序来创建一个大小为1MB的byte Array
并将其添加到ArrayList<byte[]>
中。
在添加3GB之前,我需要这样做。同样,在每次分配之后,我应该使用Thread.sleep(20)
。
我想我了解实现的外观,但是在计算确切的1MB和变量时遇到了困难。
这是我的代码的样子:
import java.util.ArrayList;
public class MemLeak
{
public static void main(String[] args)
{
int maxSize = 3221225472; // 3GB in bytes
int startSize = 0;
byte[] byteArray = new byte[1048576]; // 1MB in bytes
ArrayList<byte[]> list = new ArrayList<byte[]>();
while (startSize != maxSize) {
list.add(byteArray);
Thread.sleep(20);
startSize = startSize + 1048576;
}
}
}
就我而言,我认为字节数组中的元素数量等于以字节为单位的大小,但事实并非如此。
变量int
maxSize = 3221225472
也超出int范围。有人可以给我一些指示吗?
谢谢,非常感谢!
最佳答案
如果字节数组声明在循环内移动,则每次迭代分配1MB。进行3072次以分配3GB的总空间。无需跟踪maxSize。
如果目标是使ArrayList及其数据恰好消耗3GB内存,那将更加困难,因为ArrayList类消耗了数据之外的自己的空间,并且它也进行了自己的内部内存管理,因此可能当需要创建更多内部空间时,容量从不足3GB到超过3GB不等。看一下ArrayList.add()的源代码,以了解我的意思。