2

人们。这是一个非常常见的错误,但无论我做什么,我似乎都找不到解决方法。我使用 IDEA IntelliJ,并且很长一段时间以来,我一直在尝试实现一个有效的语义角色标签(SRL)系统,最后,我决定使用 PathLSTM 模型(https://github.com/microth/ PathLSTM),做同样的事情。

问题是,该算法依赖于 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,所以我真的不知道这个堆空间错误是如何抛出的。

也许这只是我的初学者级别的错误,但我已经尝试摆脱这个问题好几天了,如果有人能指导我如何摆脱这个问题,我将不胜感激这个错误。

谢谢你。

4

1 回答 1

1

这里有两个不同的 JVM 实例在起作用:

  • 运行 IDEA 的 JVM
  • 运行 PathLSTM 的 JVM

我怀疑这里的问题出在运行 PathLSTM 的 JVM 上。要为 授予此非默认值-Xms-Xmx您需要转到Run > Edit Configurations ...然后为您的 PathLSTM 调用选择运行配置,然后添加-XmsNNNm -XmxYYYmVM options输入中。

您可以使用JVisualVM(您可以在 JDK 的 bin 目录中找到它)查看运行 PathLSTM 时使用了多少内存。启动 IDEA,然后启动 JVisualVM,你会在 Applications 树视图的 Local 节点下看到一些东西(可能名为“Idea”),然后启动运行 PathLSTM 的任何东西,你会看到 Local 节点下出现另一个条目,单击它然后选择监视器选项卡。默认情况下,右上角显示的图表显示所选应用程序的内存使用情况。您可能会看到使用的堆增长,直到该进程获得 OOM,然后更改输入并重-XmxRun > Edit Configurations ...,直到找到所需的值。或者,选择一个非常大的值,然后让 JVisualVM 向您显示实际使用的最大值,然后编辑您的-Xmx以匹配该最大值。

这里的关键点是:

  • 您对堆大小配置所做的任何更改都必须对实际运行 PathLSTM 的 JVM 实例进行,您可以通过Run > Edit Configurations ...
  • 您可以使用 JVisualVM 来监控该JVM的运行
  • 对于 > 2GB 的堆,您需要运行 64 位 JVM
于 2017-07-31T07:48:50.340 回答