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