java - 知道为什么我的类(class)占用的内存比预期多得多吗?

标签 java oop optimization memory-management heap-memory

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

我考虑过从 double 更改为浮点,但我不允许在该项目中使用浮点。

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 时,您知道哪些 XdimArray 是您的父级“Xdim[0][8][例如4][2][10]”。

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

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

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

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

3 维中的 100 个值应表示 10^6 个 double = 1Mo 该程序实际使用了500Mo(至少是能够运行的)

编辑:我尝试跟踪 4 个维度中每轴 100 个值发生的情况。该程序创建第一个第一维数组,然后创建 100 个第二维数组中的 26 个(及其所有第三和第四维数组),然后获取所有 2Go,程序停止

最佳答案

1004确实是一亿。列表中有 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 的内存。

关于java - 知道为什么我的类(class)占用的内存比预期多得多吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55413443/

相关文章:

java - Spring 网络流程 : How to call static method from <evaluate/>?

c++ - 如何在运行时确定消息类型?

C++继承/模板问题

python - 优化大量数据的搜索和插入操作

java - 尝试将 webtable 导出到 Excel 时出现无效选择器错误

java - 如何使用java将视频下载到文件中?

JAVA:在管道上拆分并将值附加到字符串

design-patterns - 如果我有有限的时间学习一些设计模式,我应该学习哪些?

javascript - 如何优化和减少此函数中对 jQuery 的调用?

c - 更多位 : Efficiently implementing a binary search over a fixed-size array