java.lang.OutOfMemoryError:rserve java

时间:2016-01-12 12:13:44

标签: java glassfish centos6 netbeans-8 rserve

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

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

我为此尝试了许多解决方案来增加堆大小。

我尝试的解决方案是: -

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

  2. 我尝试使用"设置_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:none -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选项的Crontab -Xms1025m -Xmx4gm

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

  6. 但仍然得到同样的错误。

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

    JVM freeMemory:10

    JVM totalMemory也等于JVM的初始堆大小:10

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

    JVM中使用的内存:162

    JVM中的

    freeMemory:6

    JVM中的totalMemory显示Java堆的当前大小:15

    JVM中的maxMemory: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);
    
    
           }
          }
    

1 个答案:

答案 0 :(得分:2)

要更改在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管理界面更改设置:

Xmx setting in Glassfish Admin UI