2014-04-26 41 views
1

我正在使用StringBuilder,讀取文件的每個推文並在將其過濾到另一個文件後進行編寫。我也在每個循環結束時刷新我的StringBuilder。我在2012年中期的8GB RAM mac視網膜上。我無法處理5GB文本文件,同時得到此錯誤?

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Arrays.java:2367) 
    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130) 
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114) 
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:535) 
    at java.lang.StringBuffer.append(StringBuffer.java:322) 
    at java.io.BufferedReader.readLine(BufferedReader.java:363) 
    at java.io.BufferedReader.readLine(BufferedReader.java:382) 
    at Parser.main(Parser.java:52) 
+2

Post你的代碼看起來並不像你正在刷新你的'StringBuffer',對於5GB,你可能需要暫時的三倍:你的近5GB的緩衝區可以調整大小爲10GB,所以它可以達到15GB (假設增長因子爲2) – maaartinus

+0

檢查該主題以分配更多內存 http://stackoverflow.com/questions/2610194/how-can-i-give-eclipse-more-memory-than-512m – fasadat

+0

該代碼已發佈。 – user3575840

回答

0

從程序結構,我們可以得出結論,內存豬是一個對象,在循環的每次迭代(情況1),或者一個對象,在一次迭代中得到很大的結果(情況2)。

當BufferedReader嘗試調整其內部字符緩衝區以容納一行輸入時,stacktrace指示失敗的內存分配。這條線在失敗時間有多長?你可以通過在調試器中運行你的程序來發現,在OutOfMemoryError上有一個異常斷點,然後檢查保存了無法分配的數組大小的變量。如果它不是很大,我們可以排除情況2.

情況1最有可能的嫌疑人是LinkedHashSet存儲輸出中所有tweets的tweet_f。嘗試估計它的大小(可以用ln.size()*(50 + 2 *字符串中的平均字符串長度)獲得粗略的估計值,並確保您有足夠的內存來保存它。 d拿出沉重的工具,比如堆轉儲,將其加載到VisualVM或商業剖析器等分析工具中,請求該工具識別大對象以及哪些對這些對象的引用阻止其垃圾收集。

+0

1.是否有VisualVM for Mac? 2.我不是在LinkedHashMap中存儲所有推文,它只存儲與過濾器相匹配的推文,正如你所看到的,它正在if循環中執行.add(blah)。更別說這段代碼片了,我正在運行標準的BufferedFile reader hello world example,讀取一個相同的文件並打印出行。即使這樣也會失敗 – user3575840

+0

1.作爲Oracle JDK的一部分,我期望[JVisualVM](http://docs.oracle.com/javase/6/docs/technotes/tools/share/jvisualvm.html)在Mac上可用好。 2.您是否按照我的建議檢查線路長度是否合理? – meriton

1

聽起來就像你有內存泄漏。很難給你沒有源代碼的特定的代碼建議,但也許你有一些東西在你的StringBuilder被刷新後仍然有一個引用嗎? VisualVM是一個很好的免費工具,可用於追蹤運行時出現這類問題的位置。這個博客文章涵蓋了如何做到這一點:http://rejeev.blogspot.com/2009/04/analyzing-memory-leak-in-java.html

+0

我試着使用-Xmx20g分配20G,但仍然在線程「main」java.lang.OutOfMemoryError中說異常:請求的數組大小超過VM限制 – user3575840