在Java中将对象写入文件时内存不足

时间:2013-08-26 03:18:05

标签: java memory-leaks

我现在的项目遇到了一些麻烦。希望有人可以提供帮助。

在我的项目中,我必须从数据库加载数据并保存到HashMap并处理它(大约有5百万条记录)。

它工作得很好。对于一些小的调整,我决定将这个HashMap对象保存到文件中,并希望这将节省我一些时间,我必须重新运行该程序。

当我将HashMap写入文件时出现问题。内存耗尽。

 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("filename"));
 out.writeObject(hashMap);
 out.flush();
 out.close(); 

我的问题是

  1. 我能做些什么来解决这个问题?
  2. 在保存对象时是什么使得内存耗尽,导致当我处理这个HashMap时它很好,当保存对象时它不需要额外的内存(我错了)。
  3. (我在我的Eclipse中开发它并通过在Eclipse中以Java app 运行)进行测试

    更新stacktrace

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.io.ObjectOutputStream$HandleTable.growEntries(ObjectOutputStream.java:2331)
    at java.io.ObjectOutputStream$HandleTable.assign(ObjectOutputStream.java:2256)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1412)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
    at java.util.HashMap.writeObject(HashMap.java:1100)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
    

    我的磁盘空间大约为8GB,我认为这不是问题。

    欢迎任何建议! 谢谢。

2 个答案:

答案 0 :(得分:0)

Increase your heap memory:

It is possible to increase heap size allocated by the JVM in eclipse directly In eclipse IDE goto

Run---->Run Configurations---->Arguments

Enter -Xmx1g(It is used to set the max size like Xmx256m or Xmx1g...... m-->mb g--->gb)

答案 1 :(得分:0)

您始终可以尝试使用java -Xmx标志增加Java堆空间。例如,将您的程序运行为java -Xmx2G。在Eclipse中你可以去Run - >运行配置 - >参数 - > VM参数并在框中键入-Xmx2G。