MetaMap java.lang.OutOfMemoryError: Java heap space
MetaMap java.lang.OutOfMemoryError: Java heap space
当 运行 MetaMap(使用 Java API 和 UIMA 包装器)时,我们不断遇到 java.lang.OutOfMemoryError: Java heap space
错误。
不幸的是,日志提供的信息不多,所以我们不知道它吐在哪个文件上。
过去,我们遇到过 MetaMap 在遇到管道 (|
) 符号时创建巨大的圆形注释的问题。但是,我们使用的文件集 (MIMIC notes) 不包含任何管道符号。是否有其他字符可能表现出与管道符号类似的行为?
我们可以增加系统 RAM 来规避堆 space 问题(它实际上无法使用最大设置堆,设置为 6 GB,因为系统 RAM 是有限的),但我们更愿意了解导致问题的原因,特别是从那时起输出文件大小更易于管理。
* 编辑 *
澄清一下:我们增加了 JVM 的内存资源,这确实有助于实际推送数据(已在本地 VM 上测试)。 MetaMap 的问题是它创建了巨大的循环注解,消耗了 JVM 资源(在我们当前的系统上,OS RAM 不是最优的)。
正如我在下面的评论中指出的那样,我们对文件进行了预处理,以去除其中会引发错误的任何字符。堆 space 错误有点烦人,因为与我们遇到的其他错误不同(例如,spaces 围绕一个单独的周期,如 text . text
),这些只是抛出一个使用抛出错误的文本解析错误。对于管道符号,我们通过增加 RAM(在我们最初测试它的 VM 上)然后查看 UIMA 查看器中的注释来找到它。我们能够识别出有问题的文件,因为带有循环注释的 XMI 的输出文件非常大。
我们正在 运行 VM 上再次进行一些测试,看看我们是否可以识别问题,但如果有人有 MetaMap 经验来帮助我们识别任何有问题的字符或字符序列,那将是可取的。
* 编辑 2 *
内存应该不是问题。我们是 运行 使用 export JAVA_TOOL_OPTIONS='-Xms2G -Xmx6G -XX:MinHeapFreeRatio=25 -XX:+UseG1GC'
的应用
我们正在尝试解决循环注释的一个基本问题。这是吞噬资源和呕吐。
我想添加来自 oracle 的推荐 trouble shooting article
线程thread_name异常:java.lang.OutOfMemoryError:Java堆space
The detail message Java heap space indicates object could not be
allocated in the Java heap. This error does not necessarily imply a
memory leak
可能原因:
简单的配置问题,这里指定堆大小
申请不足。
- 应用程序无意中持有对对象的引用,并且
这可以防止对象被垃圾收集。
- 过度使用终结器。
One other potential source of this error arises with applications that
make excessive use of finalizers. If a class has a finalize method,
then objects of that type do not have their space reclaimed at garbage
collection time
垃圾回收后,对象排队等待最终确定,这在稍后发生。终结器由服务于终结队列的守护线程执行。如果终结器线程跟不上终结队列,那么 Java 堆可能会填满,并且会抛出这种类型的 OutOfMemoryError
异常。
可能导致这种情况的一种情况是,当应用程序创建高优先级线程时,导致终结队列的增长速度快于终结线程为该队列提供服务的速度。
您的 java 应用程序很可能正在使用分配的堆 space 的限制,并且达到了垃圾收集器无法有效获取必要堆 space 的地步。
考虑到您的应用正在有效地使用分配的堆 space,我认为您唯一的选择是增加分配的堆 space。你可以做这个busing
java -Xmx2048m -jar YourApp.jar
然而,也许值得分析堆 space 是如何使用的。有一些工具可以让你做到这一点。如果使用 IntelliJ,您可以尝试使用 VisualVM 插件。
解决方案有两个:
有一个UIMA JVM环境变量需要设置,如export UIMA_JVM_OPTS="-Xms128M -Xmx5g"
其次,有一个 MetaMap 开关可以减少创建注释的递归深度(在 MetaMapApiAE.xml 配置文件中):
<configurationParameterSettings>
... previous settings omitted ...
<nameValuePair>
<name>metamap_options</name>
<value>
<string>--prune 30</string>
</value>
</nameValuePair>
</configurationParameterSettings>
当 运行 MetaMap(使用 Java API 和 UIMA 包装器)时,我们不断遇到 java.lang.OutOfMemoryError: Java heap space
错误。
不幸的是,日志提供的信息不多,所以我们不知道它吐在哪个文件上。
过去,我们遇到过 MetaMap 在遇到管道 (|
) 符号时创建巨大的圆形注释的问题。但是,我们使用的文件集 (MIMIC notes) 不包含任何管道符号。是否有其他字符可能表现出与管道符号类似的行为?
我们可以增加系统 RAM 来规避堆 space 问题(它实际上无法使用最大设置堆,设置为 6 GB,因为系统 RAM 是有限的),但我们更愿意了解导致问题的原因,特别是从那时起输出文件大小更易于管理。
* 编辑 *
澄清一下:我们增加了 JVM 的内存资源,这确实有助于实际推送数据(已在本地 VM 上测试)。 MetaMap 的问题是它创建了巨大的循环注解,消耗了 JVM 资源(在我们当前的系统上,OS RAM 不是最优的)。
正如我在下面的评论中指出的那样,我们对文件进行了预处理,以去除其中会引发错误的任何字符。堆 space 错误有点烦人,因为与我们遇到的其他错误不同(例如,spaces 围绕一个单独的周期,如 text . text
),这些只是抛出一个使用抛出错误的文本解析错误。对于管道符号,我们通过增加 RAM(在我们最初测试它的 VM 上)然后查看 UIMA 查看器中的注释来找到它。我们能够识别出有问题的文件,因为带有循环注释的 XMI 的输出文件非常大。
我们正在 运行 VM 上再次进行一些测试,看看我们是否可以识别问题,但如果有人有 MetaMap 经验来帮助我们识别任何有问题的字符或字符序列,那将是可取的。
* 编辑 2 *
内存应该不是问题。我们是 运行 使用 export JAVA_TOOL_OPTIONS='-Xms2G -Xmx6G -XX:MinHeapFreeRatio=25 -XX:+UseG1GC'
我们正在尝试解决循环注释的一个基本问题。这是吞噬资源和呕吐。
我想添加来自 oracle 的推荐 trouble shooting article
线程thread_name异常:java.lang.OutOfMemoryError:Java堆space
The detail message Java heap space indicates object could not be allocated in the Java heap. This error does not necessarily imply a memory leak
可能原因:
简单的配置问题,这里指定堆大小
申请不足。
- 应用程序无意中持有对对象的引用,并且 这可以防止对象被垃圾收集。
- 过度使用终结器。
One other potential source of this error arises with applications that make excessive use of finalizers. If a class has a finalize method, then objects of that type do not have their space reclaimed at garbage collection time
垃圾回收后,对象排队等待最终确定,这在稍后发生。终结器由服务于终结队列的守护线程执行。如果终结器线程跟不上终结队列,那么 Java 堆可能会填满,并且会抛出这种类型的 OutOfMemoryError
异常。
可能导致这种情况的一种情况是,当应用程序创建高优先级线程时,导致终结队列的增长速度快于终结线程为该队列提供服务的速度。
您的 java 应用程序很可能正在使用分配的堆 space 的限制,并且达到了垃圾收集器无法有效获取必要堆 space 的地步。
考虑到您的应用正在有效地使用分配的堆 space,我认为您唯一的选择是增加分配的堆 space。你可以做这个busing
java -Xmx2048m -jar YourApp.jar
然而,也许值得分析堆 space 是如何使用的。有一些工具可以让你做到这一点。如果使用 IntelliJ,您可以尝试使用 VisualVM 插件。
解决方案有两个:
有一个UIMA JVM环境变量需要设置,如export UIMA_JVM_OPTS="-Xms128M -Xmx5g"
其次,有一个 MetaMap 开关可以减少创建注释的递归深度(在 MetaMapApiAE.xml 配置文件中):
<configurationParameterSettings>
... previous settings omitted ...
<nameValuePair>
<name>metamap_options</name>
<value>
<string>--prune 30</string>
</value>
</nameValuePair>
</configurationParameterSettings>