处理大型数据集时出现内存不足错误

Posted

技术标签:

【中文标题】处理大型数据集时出现内存不足错误【英文标题】:Outof memory error while working on large dataset 【发布时间】:2012-07-05 11:12:14 【问题描述】:

我在 LSI 上运行代码,这需要首先从数据库中获取大量数据。它适用于小型数据集。因为,我增加了数据集,它给了我以下错误。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

我目前在具有 2 GB RAM 的系统上运行代码。该错误是与 RAM 容量有关还是其他原因。

谢谢!

【问题讨论】:

您的意思是添加 java 标签而不是 .net 吗? jguru.com/faq/view.jsp?EID=1300058 回答你的问题了吗? 【参考方案1】:

当您运行 Java 时,您必须针对您的特定问题传递 VM 参数。 您需要增加堆值:

-Xms40m - minimum heap size in MB
-Xmx1024m - maximum heap size in MB

java test.java -Xms40m -Xmx1024m

在启动您的应用程序时。如需更多信息,请参阅Oracle documentation。或者,如果您使用 Eclipse,请在 ecliplse.ini 文件中增加此大小。

【讨论】:

【参考方案2】:

如果它与您的 RAM 有关,您的处理器将停止 Java。所以肯定不是。这是因为java 堆内存已满,并且堆空间中的所有对象都处于活动状态,因此不会进行垃圾收集过程。所以堆空间中没有足够的内存来处理进一步的数据。因为这个原因,您会收到此错误。

【讨论】:

【参考方案3】:

除了增加您的应用程序可以拥有的最大堆大小(可能是您需要做的所有事情)之外,听起来您可能能够显着减少正在使用的内存量。如果您正在索引文档,在标准 LSI 设置中,您一次应该只能将 1 个文档加载到内存中。所以假设你有一个文档列表,你遍历列表并:加载、索引、关闭。冲洗并重复。

我认为这可能是您的问题,因为您的代码适用于较小的数据集。另一种可能性是,当您扩展数据集时,您将包含一些用尽所有堆空间的巨大文档。在这种情况下,最简单的解决方案就是增加堆空间。

【讨论】:

【参考方案4】:

首先检查您为服务器分配了多少堆空间。如果它看起来很低,那么您可以使用以下参数来增加它 -

-Xms128m   -  minimum heap size in MB
-Xmx1024m -  maximum heap size in MB

通常,当可用 hep 大小已满且没有可用于程序正常执行的内存时,我们会收到此异常。

【讨论】:

【参考方案5】:
    -Xmx 表示最大堆大小, -Xms 用于初始堆大小,

重要的一点是以上两种语法都区分大小写。太小心了。

如何在 Tomcat 中设置 java 堆大小? 停止 Tomcat 服务器,设置环境变量 CATALINA_OPTS,然后重启 Tomcat。查看文件 tomcat-install/bin/catalina.sh 或 catalina.bat 了解如何使用此变量。例如,

设置 CATALINA_OPTS=-Xms512m -Xmx512m(Windows,值周围没有“”) export CATALINA_OPTS="-Xms512m -Xmx512m" (ksh/bash, "" 围绕值) setenv CATALINA_OPTS "-Xms512m -Xmx512m" (tcsh/csh, "" 围绕值)

在 catalina.bat 或 catallina.sh 中,您可能已经注意到 CATALINA_OPTS、JAVA_OPTS 或两者都可用于指定 Tomcat JVM 选项。 CATALINA_OPTS 和 JAVA_OPTS 有什么区别?名称 CATALINA_OPTS 特定于 Tomcat servlet 容器,而 JAVA_OPTS 可能被其他 java 应用程序使用 (例如,JBoss)。由于环境变量由所有应用程序共享,我们不希望 Tomcat 无意中选择用于其他应用程序的 JVM 选项。我更喜欢使用 CATALINA_OPTS。

如何在 JBoss 中设置 java 堆大小?

停止 JBoss 服务器,编辑 $JBOSS_HOME/bin/run.conf,然后重新启动 JBoss 服务器。您可以将带有 JAVA_OPTS 的行更改为:

JAVA_OPTS="-server -Xms128m -Xmx128m"

如何在 Eclipse 中设置 java 堆大小? 您有 2 个选项: 1. 编辑 eclipse-home/eclipse.ini 如下所示,然后重启 Eclipse。

-vmargs-Xms64m-Xmx256m2。或者,您可以在最后运行带有附加选项的 eclipse 命令。 -vmargs 之后的任何内容都将被视为 JVM 选项并直接传递给 JVM。以这种方式在命令行中指定的 JVM 选项将始终覆盖 eclipse.ini 中的选项。 例如,

eclipse -vmargs -Xms64m -Xmx256m

如何在 NetBeans 中设置 java 堆大小? 退出 NetBeans,编辑文件 netbeans-install/etc/netbeans.conf。例如,

netbeans_default_options="-J-Xms512m -J-Xmx512m -J-XX:PermSize=32m -J-XX:MaxPermSize=128m -J-Xverify:none

如果您有任何疑问,请参考以下链接。感谢他们提供详细信息。

enter link description here

【讨论】:

以上是关于处理大型数据集时出现内存不足错误的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中执行大型 SQL 查询字符串时出现“内存不足”错误

Powershell - 针对大型目录运行脚本时出现内存不足错误

将大型 JSON (InputStream) 放入 String 时出现内存不足错误

将火花数据帧写入镶木地板格式时出现内存不足错误

读取块中的csv文件时出现内存不足错误

使用 Firebase 时出现内存不足错误