2017-07-30 35 views
2

人。這是一個非常常見的錯誤,但無論我做什麼,我似乎都無法找到解決辦法。 我使用IDEA IntelliJ,並且相當長一段時間以來,我一直在嘗試實施一個可用的語義角色標註(SRL)系統,最後,我決定使用PathLSTM模型(https://github.com/microth/PathLSTM)也這樣做。Java - 奇怪的堆空間錯誤不斷拋出

問題是,這種算法取決於其大如2.7G,爲它的解析操作的模型文件(https://drive.google.com/uc?id=0B5aLxfs6OvZBYUk2b0hLZjNqY3c&export=download

這引發了我的不足堆空間 - 內存不足錯誤


Loading pipeline from 
C:\Users\Vyso\Downloads\NLP\SRL\SEMAFOR\absSemafor\LTH\wttv\PathLSTM-pre- 
illinois-built\srl-ACL2016-eng.model 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
at java.lang.reflect.Array.newInstance(Array.java:75) 
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1883) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1529) 
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1919) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1529) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1919) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1529) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) 

Process finished with exit code 1 

所以很自然,我改變了我的兩個系統上的JVM,和我的IDE,在那裏我可以改變vmoptions,如下的堆空間。 (默認情況下是-Xms128m和-Xmx512m)。


# custom IntelliJ IDEA VM options 

-Xms2048m 
-Xmx4000m 
-XX:ReservedCodeCacheSize=240m 
-XX:+UseConcMarkSweepGC 
-XX:SoftRefLRUPolicyMSPerMB=50 
-ea 
-Dsun.io.useCanonCaches=false 
-Djava.net.preferIPv4Stack=true 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:-OmitStackTraceInFastThrow 

但是,即使最大堆周圍空間4G分配後,我得到的錯誤。 有趣的是,在我的IDE的內存管理工具欄中,我可以看到代碼在運行時使用的最大值僅爲500m,因此我真的不知道堆空間錯誤仍然如何拋出。

也許這只是我身邊的初學者級別的錯誤,但我一直試圖擺脫這個問題好幾天了,我真的很感激,如果有人能指導我如何可以擺脫這個錯誤。

謝謝。

+0

IDE堆運行大小不會影響應用程序的堆大小,您需要在運行/調試配置VM選項字段中指定它。 – CrazyCoder

+0

@CrazyCoder,是的。我試過了。哥們,再次給我同樣的錯誤。你認爲我應該做多少? – user8389863

回答

1

有在這裏玩兩個不同的JVM實例:

  • 這是運行IDEA
  • 這是運行PathLSTM

我這裏懷疑問題JVM中的JVM與JVM運行PathLSTM。要爲-Xms,-Xmx授予此非默認值,您需要轉至Run > Edit Configurations ...,然後爲您的PathLSTM調用選擇運行配置,然後將-XmsNNNm -XmxYYYm添加到VM options輸入。

您可以使用JVisualVM(您可以在JDK的bin目錄中找到它)來查看運行PathLSTM時正在使用多少內存。啓動IDEA,然後啓動JVisualVM,你會在應用程序樹視圖的本地節點下看到一些東西(可能名爲「Idea」),然後啓動任何運行PathLSTM的東西,你會看到另一個條目出現在本地節點下,然後點擊它選擇監視器選項卡。默認情況下,此處顯示的右上角的圖形顯示所選應用程序的內存使用情況。您可能會看到堆已使用,直到該進程得到OOM,然後更改Run > Edit Configurations ...中的-Xmx,然後重試,直到找到所需的值。或者,選擇一個非常大的值,然後讓JVisualVM顯示您使用的實際最大值,然後編輯您的-Xmx以匹配最大值。

這裏的關鍵點是:

  • 您對堆大小配置必須到JVM實例,它實際上是運行PathLSTM所做的任何更改,您配置JVM通過Run > Edit Configurations ...
  • 您可以使用JVisualVM監測 JVM
  • 對於>堆2GB你需要運行64位JVM
+0

謝謝@glitch。我現在明白了。 :)呃,大多數人直接從命令行運行這個算法,通過指定-java -Xmx40g -cp ...這是否意味着他們有40GB或更大的RAM,它們將它們用作堆空間?我是否也需要這個,來運行我的應用程序? Thnx你的時間。 – user8389863

+0

運行java -Xmx40g肯定_implies_,他們希望能夠解決40GB的內存,他們是否需要這麼多的內存是另一回事:)我會建議運行你的進程並同時運行JVisualVM來查看它使用了多少內存你可以計算出它實際需要的內存量**,然後相應地配置它的JVM。 – glytching

+0

謝謝!這讓我瘋狂 – Coop