知道为什么我的课程会占用比预期更多的内存吗?

问题描述 投票:0回答:1

我正在尝试创建一个类,它将充当X维ArrayList,它将包含我的X维函数的输出。该类工作正常,但内存消耗比它应该高得多,因此我不能将它用于太高维度的太多值。

我想过从double变为float但是我不允许在这个项目中使用浮动。

public ArrayList<XDimensionArray> inception = new ArrayList<XDimensionArray>();

public ArrayList<Double> HistoricInputs= new ArrayList<Double>();
public ArrayList<Double> inputs = new ArrayList<Double>();
public ArrayList<Double> outputs= new ArrayList<Double>();
private int dimensionCourante;
private int dimensionMax;

public XDimensionArray(ArrayList<Pair> Tab_Limites,int _dimensionCourante,int precision,ArrayList<Double> _HistoricInputs)
{
    HistoricInputs = _HistoricInputs;
    dimensionCourante = _dimensionCourante;
    dimensionMax = Tab_Limites.size();
    for(Double i = Tab_Limites.get(dimensionCourante - 1).min; i < Tab_Limites.get(dimensionCourante - 1).max; i += 1./precision)
    {
        inputs.add(i);
        if (dimensionCourante < dimensionMax)
        {
            ArrayList<Double> temp = new ArrayList<Double>();
            temp.addAll(HistoricInputs);
            temp.add(i);
            inception.add(new XDimensionArray(Tab_Limites,dimensionCourante + 1,precision,temp));
        }
        if (dimensionCourante == dimensionMax)
            outputs.add(SetOutput(i));
    }
}

代码说明:你调用给它的类

  • 表示轴的最小/最大表数组,从该数组的大小开始,类猜测最大维数。
  • 要生成的当前维度(第一次调用始终为1)
  • 表示每单位轴创建多少个点的精度(在-5轴上; 5个精度为10,我们得到100个点,每个点数为0.1) - 输入的历史记录让我们知道谁是Xdimension的父母我们处于较低维度时的数组(基本上,当你在第六维XdimArray时,你知道哪些XdimArrays是你的父母“Xdim [0] [8] [4] [2] [10]”。

对于我们想要在轴上创建的每个点,

- 如果这不是最低维度,我们用一维较低的新对象填充XdimensionArray数组

- 如果这是最低维度,我们最终填充输出数组。

每轴和4轴运行100个值的程序将意味着100 ^ 4值(双倍)应该使用100Mo的内存吗?但我的程序吃掉了我给他的所有记忆(2.2Go),但仍然不够。

100个3维的值应该意味着10 ^ 6双打= 1Mo该程序实际上使用500Mo(至少它能够运行)

编辑:我尝试跟踪4维中发生的事情,每轴100个值。该程序创建了第一个第一维aray,然后是100个第二维数组中的26个(以及所有第3和第4个dim数组),然后所有2Go都被占用并且程序停止

java oop optimization memory-management heap-memory
1个回答
1
投票

1004确实是1亿。列表中有1亿个条目,而不是1亿个字节。

double是8字节的内存。但你不使用double,你使用java.lang.Double,它是一个对象,而不是原始值。我相信一个对象头是16个字节,因此16 + 8是24个字节。

并且您的ArrayList包含每个DOuble的4到8个字节的引用数组(取决于您是否有32位或64位VM以及是否使用压缩指针),因此每个double需要28-32个字节。

这意味着您需要2.8Gb(SI单位)到3.2Gb的内存。

© www.soinside.com 2019 - 2024. All rights reserved.