我真的希望我的标题是正确的,但让我准确解释一下标题的含义。
我需要编写一个程序来创建一个大小为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()的源代码,以了解我的意思。

10-08 06:39