2

我目前的项目遇到了一些麻烦。希望有人能帮忙。

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

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

当我将该 HashMap 写入文件时,问题就出现了。它内存不足。

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

我的问题是

  1. 我能做些什么来解决这个问题?
  2. 是什么导致它在保存对象时耗尽内存,因为当我处理这个 HashMap 时它很好,而在保存对象时它不需要额外的内存(我错了)。

(我正在我的 Eclipse 中开发它并通过Run as java app in Eclipse 对其进行测试)

更新堆栈跟踪

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,我认为这不是问题。

欢迎任何建议!谢谢你。

4

2 回答 2

1

您可以随时尝试使用 java -Xmx 标志增加 java 堆空间。例如,将您的程序作为java -Xmx2G. 在 Eclipse 中,您可以转到 Run -> Run Configurations -> Arguments -> VM Arguments 并在框中键入 -Xmx2G。

于 2013-08-26T03:25:52.157 回答
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)
于 2013-08-26T03:25:22.323 回答