代码之家  ›  专栏  ›  技术社区  ›  horcle_buzz

MetaMap java.lang.OutOfMemoryError:java堆空间

  •  0
  • horcle_buzz  · 技术社区  · 6 年前

    java.lang.OutOfMemoryError: Java heap space 运行MetaMap(使用Java API和UIMA包装)时出错。

    不幸的是,这些日志信息不多,所以我们不知道它吐在哪个文件上。

    在过去,当MetaMap遇到管道时,我们会遇到创建巨大圆形注释的问题( | MIMIC notes

    我们可以增加系统RAM以避免堆空间问题(实际上无法使用最大集堆,因为系统RAM是有限的,所以设置为6GB),但我们更希望知道是什么导致了这个问题,特别是因为输出文件的大小更易于管理。

    *编辑*

    text . text ),它们只是抛出一个解析错误,而文本抛出了错误。在管道符号的例子中,我们通过增加RAM(在我们最初测试它的VM上)然后在UIMA查看器中查看注释来找到它。我们能够识别有问题的文件,因为带有循环注释的XMI的输出文件大小非常大。

    export JAVA_TOOL_OPTIONS='-Xms2G -Xmx6G -XX:MinHeapFreeRatio=25 -XX:+UseG1GC'

    我们正试图解决循环注释的一个基本问题。这是在吞噬资源和呕吐。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Lucian Bredean    6 年前

    您的java应用程序很可能正在使用所分配的堆空间,并且垃圾收集器无法有效地获得所需的堆空间。

    考虑到您的应用程序正在有效地使用分配的堆空间,我认为您唯一的选择是增加分配的堆空间。你可以忙着做这件事

    java -Xmx2048m -jar YourApp.jar
    

    然而,也许有必要分析堆空间是如何使用的。有一些工具可以让你做到这一点。如果使用IntelliJ,您可以尝试使用VisualVM插件。

        2
  •  0
  •   user10866229 user10866229    6 年前

    我想添加oracle的建议 trouble shooting article

    线程名称中的异常: java.lang.OutOfMemoryError:java堆空间

    在Java堆中分配。这个错误不一定意味着错误 内存泄漏

    1. 简单配置问题,其中指定的堆大小

      对于该应用程序来说,此选项是不够的。

    2. 应用程序无意中保留对对象的引用,并且

    此错误的另一个潜在来源是 过度使用终结器。如果类有finalize方法, 那么,该类型的对象在垃圾回收时不会回收其空间 收集时间

    垃圾收集之后,对象将排队等待最终确定,这将在稍后发生。终结器由为终结队列提供服务的守护进程线程执行。如果终结器线程无法跟上终结队列,那么Java堆可能会填满,并且这种类型的 OutOfMemoryError 异常将被抛出。

        3
  •  0
  •   horcle_buzz    6 年前

    解决方案有两个方面:

    需要设置一个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>