Java:读取序列化文件时没有足够的堆空间

时间:2017-03-22 12:40:00

标签: java file memory heap

在一种方法中,我从邻接列表创建一个序列化文件,我试图用另一种方法读取如下:

    D TblAryDs        DS                  qualified dim(9999)                    
    D  tblName                       3                                           
    D  tblElement                   10                                           
    D  tblDivision                   5                                           
    D  tblRes                        2                                           

//Not Sure How to do the below lookup
      idx = %lookup(tblName:TblAryDs(*).tblName) && %lookup(tblElement:TblAryDs(*).tblElement) && %lookup(tblDivision:TblAryDs(*).tblDivision);                                
      if idx > *zeros;                                                                                   
         return TblAryDs(*).tblRes;
      endif; 

现在,虽然文件本身大约500MB,但我得到了一个 OOM:Java堆空间错误,即使我将堆大小增加到2000MB,但是它再次适用于6000MB的堆。

我想知道,为什么相同的信息在内存中占用的空间比在硬盘上占用的空间多?

1 个答案:

答案 0 :(得分:1)

这是一个非常粗略的路径。这样您就可以了解计算机在加载文件时的作用。这不是100%准确,实际过程可能会有所不同,效率更高,这只是为了说明为什么计算机需要这么多内存。

  • 文件已加载到内存中: 500MB。
  • 解析文件,在解析过程中分配临时变量,使用类型描述构建键值对并验证,大约1000-1500mb
  • 实例化对象。加载默认变量。不过需要多少。比如0.01mb。
  • 将变量分配给object,将值转换为实际类型。另外500mb的临时变量。
  • 变量在对象实例中,让我们说400mb。

所以总计达到了3650.01mb。

然后垃圾收集器在某个时刻到来并清理了一塌糊涂,你剩下大约400mb。