Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:读取序列化文件时堆空间不足_Java_File_Memory_Heap - Fatal编程技术网

Java:读取序列化文件时堆空间不足

Java:读取序列化文件时堆空间不足,java,file,memory,heap,Java,File,Memory,Heap,在一种方法中,我从邻接列表创建了一个序列化文件,我正试图在另一种方法中读取它,如下所示: Map<Integer, List<Integer>> adj; int[] count; int N; ArrayList<Double> weights; try ( ObjectInputStream input1 = new ObjectInputSt

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

Map<Integer, List<Integer>> adj;
        int[] count;
        int N;
        ArrayList<Double> weights;

            try (
                    ObjectInputStream input1 = new ObjectInputStream(new FileInputStream("GIRGnew5adj.ser"));
                ){


        N = (int)input2.readObject();     
        adj = (Map<Integer, List<Integer>>)input1.readObject();
Map;
int[]计数;
int N;
阵列列表权重;
试一试(
ObjectInputStream input1=新的ObjectInputStream(新文件InputStream(“GIRGnew5adj.ser”);
){
N=(int)input2.readObject();
adj=(映射)input1.readObject();
现在,虽然文件本身大约有500MB大,但即使我将heapsize增加到2000MB,我也会得到一个OOM:Java堆空间错误,但它同样适用于6000MB的堆


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

这是一个非常粗略的过程。这样你就可以知道计算机在加载文件时会做什么。这不是100%准确,实际过程可能会有所不同,效率更高,这只适用于像gi这样的用户我明白为什么计算机需要这么多内存

  • 文件将加载到内存中: 500兆
  • 解析文件,在解析过程中分配临时变量,使用类型描述构建键值对并进行验证,大约1000-1500mb
  • 一个对象被实例化。默认变量被加载。不管需要多少。比如说0.01mb
  • 变量被分配给对象,值被转换为实际类型。另外500mb的临时变量
  • 变量在对象实例中,比如说400mb
所以总共有3650.01mb卢布

然后,垃圾收集器在某个时候经过并清理了垃圾,剩下大约400mb