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

时间:2019-03-29 08:41:21

标签: java oop optimization memory-management heap-memory

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

我曾考虑过将double更改为float,但不允许在该项目中使用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数组的父对象(基本上,在第6维XdimArray中时,您知道哪个XdimArrays是您的父母“ Xdim [0] [8] [ 4] [2] [10]”。

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

-如果这不是最小维度,则将XdimensionArray数组填充低一维的新对象

-如果这是最小尺寸,我们将最终填充输出数组。

每轴和4轴运行100个值的程序意味着100 ^ 4个值(双精度),应该使用100Mo的内存对吗?但是我的程序吞噬了我给他的所有内存(2.2Go),仍然不够用。

3个维度中的100个值应表示10 ^ 6双精度= 1Mo 该程序实际上使用了500Mo(至少可以运行)

编辑:我尝试按照每轴100个值在4维中进行跟踪。该程序将创建第一个1r维数组,然后在100个2维数组(及其所有的3rd和4rst暗数组)中创建26个,然后取走所有2Go并暂停程序

1 个答案:

答案 0 :(得分:1)

100 4 确实是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的内存。