java - 我已经在 Eclipse 中更改了内存大小,但仍然收到 java.lang.OutOfMemoryError

标签 java memory memory-management heap-memory

我正在运行一个 Java 程序,它从一个 1.2 GB 大的文件中逐行读取,并在某些时候尝试将它们放入哈希中。调用taxhash.put(tmpgi,tmptax)一段时间后,它给了我 java.lang.OutOfMemoryError 错误。

我尝试并更改了 eclipse.ini 选项,如下

-startup
plugins/org.eclipse.equinox.launcher_1.1.1.R36x_v20101122_1400.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.2.R36x_v20101222
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
512M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
512m
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms2048m
-Xmx3548m

顺便说一句,我正在 64 位 win 7 和 4GB 内存上运行我的代码。这是从文件中读取的代码!

boolean readfile(String filename,int verbose){
        //this should read the inputfile and save the data in it to the gitax array.
        taxhash=new HashMap();
        int currnum=0;
        try{
            BufferedReader inread=new BufferedReader(new FileReader(filename));
            String instring;
            String[] tmparr;
            Integer tmpgi;
            Integer tmptax;
            if(verbose>0){
                while ((instring=inread.readLine())!=null){
                    currnum++;
                    instring=instring.trim();
                    tmparr=instring.split("\\s+",0);//split on one or more whitespaces
                    //now I should have two elements in this array, the gi number and the taxid
                    if(java.lang.reflect.Array.getLength(tmparr)!=2){
                        System.err.println("Error reading from "+filename+" "+java.lang.reflect.Array.getLength(tmparr)+" elements.");
                    }else{
                        try{
                            tmpgi=Integer.valueOf(tmparr[0]);
                            tmptax=Integer.valueOf(tmparr[1]);
                        }catch (NumberFormatException e){
                            System.err.println("unable to parse number from "+tmparr[0]+" "+tmparr[1]);
                            return false;
                        }
                        taxhash.put(tmpgi,tmptax);
                    }
                    if(currnum==100000){
                        System.out.print(".");
                        currnum=0;
                    }
                }
            }else{
                while ((instring=inread.readLine())!=null){
                    instring=instring.trim();
                    tmparr=instring.split("\\s+",0);//split on one or more whitespaces
                    //now I should have two elements in this array, the gi number and the taxid
                    if(java.lang.reflect.Array.getLength(tmparr)!=2){
                        System.err.println("Error reading from "+filename+" "+java.lang.reflect.Array.getLength(tmparr)+" elements.");
                    }else{
                        try{
                            tmpgi=Integer.valueOf(tmparr[0]);
                            tmptax=Integer.valueOf(tmparr[1]);
                        }catch (NumberFormatException e){
                            System.err.println("unable to parse number from "+tmparr[0]+" "+tmparr[1]);
                            return false;
                        }
                        taxhash.put(tmpgi,tmptax);
                    }
                }
            }
        }catch (IOException e){
            System.err.println("IOError in reading from "+filename);
            e.printStackTrace();
            return false;
        }
        return true;
    }// end readfile

这是更详细的错误:线程“main”中的异常

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.HashMap.resize(Unknown Source)
    at java.util.HashMap.addEntry(Unknown Source)
    at java.util.HashMap.put(Unknown Source)
    at com.ali.Blammer.taxid.readfile(taxid.java:79)
    at com.ali.Blammer.taxid.readfile(taxid.java:50)
    at com.ali.Blammer.main.run(main.java:182)
    at com.ali.Blammer.blammer.main(blammer.java:36)
    at com.ali.Interface.main.main(main.java:53)

最佳答案

您正在更改影响 eclipse JVM 的内存选项,而不是您运行的程序的内存选项。

在运行配置中,第二个选项卡允许设置运行执行的 JVM 参数。无论如何,我怀疑您是否会将 1.2GB 的文件(加上哈希值和其他开销)放入 512 MB

关于java - 我已经在 Eclipse 中更改了内存大小,但仍然收到 java.lang.OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16755400/

相关文章:

objective-c - Cocos2d 中内存管理的推荐限制?

java - 如何从特定列中获取所有价格添加它们并打印它们

java - Java String.format() 是否存在内存泄漏

java - 如何从 Java Rest Web 服务返回 ajax 中的值?

python - Keras模型训练内存泄漏

c - malloc 相对于 calloc 的安全/性能影响?

memory-management - 在动态存储分配和释放期间使用循环链表作为 "free list"v/s 平衡二叉搜索树

java - Eclipse 创建 .gitignore 文件和开放资源不起作用

linux - PCIe - DMA : Consistent vs. 流内存

java - Java堆中的constantPoolClass?