java.lang.OutOfMemory错误: Java heap space in rserve java

标签 java glassfish centos6 netbeans-8 rserve

我正在从 Java 运行一个 Rscript,它有两个函数,一个将返回数据帧,另一个将返回函数 1 返回的数据帧的列名称。

对于 400 MB 的数据,代码运行良好,但当我测试超过 400 MB 的数据时,它会抛出异常:线程“main”java.lang.OutOfMemoryError 中的异常:Java 堆空间

我已经尝试了很多解决方案来增加堆大小。

我尝试过的解决方案是:-

  1. 我已经编辑了 glassfish 的domain.xml 文件。

  2. 我尝试使用“set _JAVA_OPTIONS = -Xms1025m -Xmx4gm”设置完全 Java 选项并导出 JAVA_OPT= -Xms1025m -Xmx4g。

  3. 将 netbeans.conf 文件编辑为

    netbeans_default_options="-J-Xms1025m -J-Xmx4g -J-Xss32m -J-XX:PermSize=128m -J-XX:MaxPermSize=2g -J-Xverify:无 -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.dpiaware=true -J-Dsun.zip.disableMemoryMapping=true"

  4. 带有 Java 选项 -Xms1025m -Xmx4gm 的 Crontab

  5. 还更改了 netbeansproject->properties->run->vmoption。

但仍然遇到同样的错误。

当我尝试使用下面的 Java 代码检查堆大小时。它正在展示一些不同的东西。我不明白哪个是正确的,哪个是错误的。堆大小是否更改。如何知道它以及如何解决这个问题? 我在搜索错误时从某个网站获得了此代码。 我得到的输出是 运行:

JVM 可用内存:10

JVM 总内存也等于 JVM 的初始堆大小:10

JVM maxMemory 也等于 JVM 的最大堆大小:168

JVM 中已用内存:162

JVM 中的空闲内存:6

JVM 中的总内存显示 Java 堆的当前大小:15

JVM 中的最大内存:168

JVM 位大小:amd64

堆大小 = 163123200

   public class MemoryUtil
   {

    private static final int MegaBytes = 10241024;

    public static void main(String args[]) {

           long freeMemory = Runtime.getRuntime().freeMemory()/MegaBytes;
           long totalMemory = Runtime.getRuntime().totalMemory()/MegaBytes;
           long maxMemory = Runtime.getRuntime().maxMemory()/MegaBytes;

           System.out.println("JVM freeMemory: " + freeMemory);
           System.out.println("JVM totalMemory also equals to initial heap size of JVM : "
                                     + totalMemory);
           System.out.println("JVM maxMemory also equals to maximum heap size of JVM: "
                                     + maxMemory);

           ArrayList objects = new ArrayList();

           for (int i = 0; i < 10000000; i++) {
                 objects.add(("" + 10 * 2710));
           }

           freeMemory = Runtime.getRuntime().freeMemory() / MegaBytes;
           totalMemory = Runtime.getRuntime().totalMemory() / MegaBytes;
           maxMemory = Runtime.getRuntime().maxMemory() / MegaBytes;

           System.out.println("Used Memory in JVM: " + (maxMemory - freeMemory));
           System.out.println("freeMemory in JVM: " + freeMemory);
           System.out.println("totalMemory in JVM shows current size of java heap : "
                                     + totalMemory);
           System.out.println("maxMemory in JVM: " + maxMemory);
      System.out.println("JVM Bit size: " + System.getProperty("os.arch"));

         long heapSize = Runtime.getRuntime().totalMemory();

    //Print the jvm heap size.
    System.out.println("Heap Size = " + heapSize);


       }
      }

最佳答案

要更改 Glassfish 中运行的应用程序的最大堆大小,您只需编辑 domain.xml 中的设置。

停止 Glassfish,使用文本编辑器打开文件(/GLASSFISH_HOME/glassfish/domains/domain1/config/domain.xml)并搜索 Xmx (第一个结果),它应该如下所示:

    <jvm-options>blabla</jvm-options>
    <jvm-options>-Xmx512m</jvm-options>

如果您已经接触过它,它可能包含另一个值。将值更改为如下所示:

    <jvm-options>blabla</jvm-options>
    <jvm-options>-Xmx4096m</jvm-options>

请注意,Glassfish 本身需要一些内存才能运行,如果您的硬件规范允许,我建议您仅在设置中为 Glassfish 添加额外的 350 MB 内存。

或者,您可以使用 Glassfish 管理 UI 来更改设置:

Xmx setting in Glassfish Admin UI

关于java.lang.OutOfMemory错误: Java heap space in rserve java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34743409/

相关文章:

node.js - 我可以在 CentOS 6x 上安装 nodejs v.8.12 吗?

java - 为什么只有当我有内部类时才会出现 "non-static variable this cannot be referenced from a static context"错误?

java - 包含另一个类的实体持久保存到 MySQL 中

java - 需要了解 java.sql.SQLException : No suitable driver found for jdbc:postgresql error 原因的建议

java - GlassFish 应用程序客户端容器

security - 在 CentOS 6 上配置 Kerberos 时出错

centos - 无法在 CentOS 6 上安装 AUTHBIND

java - Android Studio - 尽管其中没有任何零值,但计算结果为 0

java - 在不作为 Windows 服务运行的情况下为 JSP 运行网络服务器

cors - 在 Payara(或 Glassfish)服务器中启用 CORS 设置