-3

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

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

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

谢谢!

4

5 回答 5

2

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

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

java test.java -Xms40m -Xmx1024m

启动您的应用程序时。有关详细信息,请参阅Oracle 文档。或者,如果您使用 Eclipse,请在ecliplse.ini文件中增加此大小。

于 2012-07-05T04:10:07.070 回答
1

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

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

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

于 2012-07-05T05:19:59.697 回答
0
  1. -Xmx 为最大堆大小,
  2. -Xms 用于初始堆大小,

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

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

set CATALINA_OPTS=-Xms512m -Xmx512m (Windows, no "" around the value) export CATALINA_OPTS="-Xms512m -Xmx512m" (ksh/bash, "" around the value) 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

如果您有疑问,请参阅下面的链接。感谢他们提供详细信息。

在此处输入链接描述

于 2012-07-05T05:37:37.217 回答
0

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

于 2012-07-05T04:15:00.093 回答
0

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

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

于 2012-07-05T04:20:21.993 回答