2013-08-26 77 views
1

我在當前項目中遇到了一些問題。希望有人能夠幫助。將對象寫入Java文件時內存不足

在我的項目中,我必須從數據庫加載數據並保存到HashMap並進行處理(大約有5百萬條記錄)。

它工作的很好。對於一些小小的調整,我決定將這個HashMap對象保存到文件中,並希望這會爲我節省一些時間,以便重新運行此程序。

當我將該HashMap寫入文件時出現問題。它耗盡內存。

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

我的問題是

  1. 我能做些什麼解決這個問題呢?
  2. 什麼使得它在保存對象時耗盡內存,導致當我正在處理這個HashMap時它很好,當保存對象時它不需要額外的內存(我是錯的)。

(我開發它在我的Eclipse和運行在Eclipse的Java應用程序測試)

更新堆棧跟蹤

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和我認爲這不是問題。

歡迎任何建議! 謝謝。

+0

請發佈堆棧跟蹤。 – Kishore

+0

你的'HashMap'包含多少個對象? –

+0

我希望你的磁盤有足夠的空間?或者你得到java permSpace內存錯誤? –

回答

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) 
0

您可以隨時使用java -Xmx標誌嘗試增加java堆空間。例如,運行程序java -Xmx2G。在Eclipse中,您可以運行 - >運行配置 - >參數 - > VM參數,並在框中鍵入-Xmx2G。