在Eclipse中增加堆空间:(java.lang.OutOfMemoryError)

时间:2011-12-22 08:07:13

标签: java eclipse exception-handling

try {
    // CompareRecord record = new CompareRecord();
    Connection conn = new CompareRecord().getConection("eliteddaprd","eliteddaprd","192.168.14.104","1521");
    ResultSet res = null;

    if (conn != null){
        Statement stmt = conn.createStatement();
        res = stmt.executeQuery("select rowindx,ADDRLINE1 from dedupinitial order by rowindx");
    }

    Map<Integer,String> adddressMap = new LinkedHashMap<Integer, String>();
    if (res != null){
        System.out.println("result set is not null ");
        while(res.next()){
            adddressMap.put(res.getInt(1),res.getString(2));
        }
    }

    System.out.println("address Map size =========> "+adddressMap.size());
    Iterator it = adddressMap.entrySet().iterator();
    int count = 0;
    int min = 0;

    while (it.hasNext()){
        Map.Entry pairs = (Map.Entry)it.next();
        Pattern p = Pattern.compile("[,\\s]+");
        Integer outerkey = (Integer)pairs.getKey();
        String outerValue = (String)pairs.getValue();
        //System.out.println("outer Value ======> "+outerValue);

        String[] outerresult = p.split(outerValue);
        Map.Entry pairs2 = null;
        count++;
        List<Integer> dupList = new ArrayList<Integer>();

        Iterator innerit = adddressMap.entrySet().iterator();
        boolean first = true;

        while (innerit.hasNext()){
            //System.out.println("count value ===> "+count);
            int totmatch = 0;
            if(first){
                if(count == adddressMap.size()){
                    break;
                }
                for(int i=0;i<=count;i++){
                    pairs2 = (Map.Entry)innerit.next();
                }
                first  = false;
            }
            else{
                pairs2 = (Map.Entry)innerit.next();
            }
            Integer innterKey = (Integer)pairs2.getKey();
            String innerValue = (String)pairs2.getValue();
            //System.out.println("innrer value "+innerValue);
            String[] innerresult = p.split(innerValue);

            for(int j=0;j<outerresult.length;j++){
                for(int k=0;k<innerresult.length;k++){
                    if(outerresult[j].equalsIgnoreCase(innerresult[k])){
                        //System.out.println(outerresult[j]+" Match With "+innerresult[k]);
                        totmatch++;
                        break;
                    }
                }
            }

            min = Math.min(outerresult.length, innerresult.length);
            if(min != 0 && ((totmatch*100)/min) > 50) {
                //System.out.println("maching inner key =========> "+innterKey);
                dupList.add(innterKey);
            }
        }
        //System.out.println("Duplilcate List Sisze ===================> "+dupList.size()+"   "+outerkey);
    }

    System.out.println("End  =========> "+new Date());
}
catch (Exception e) {
    e.printStackTrace();
}

这里ResultSet已处理了大约500000条记录,但它会给我一个错误:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.HashMap.resize(HashMap.java:508)
    at java.util.LinkedHashMap.addEntry(LinkedHashMap.java:406)
    at java.util.HashMap.put(HashMap.java:431)
    at spite.CompareRecord.main(CompareRecord.java:91)

我知道这个错误是因为VM内存,但不知道如何在Eclipse中增加它?

如果我必须处理超过500,000条记录,我该怎么办?

15 个答案:

答案 0 :(得分:147)

在Run-&gt; Run Configuration中找到您正在运行的类的名称,选择它,单击Arguments选项卡,然后添加:

-Xms512M -Xmx1524M

到VM Arguments部分

答案 1 :(得分:38)

在Eclipse下载文件夹中,输入eclipse.ini文件中的条目:

--launcher.XXMaxPermSize
512M
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx1024m

或者你想要的任何价值。

答案 2 :(得分:7)

请参阅http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html

-Xms和-Xmx设置堆的最小和最大大小。作为一项功能,Hotspot限制了堆大小,以防止它吹灭你的系统。因此,一旦你弄清楚应用程序需要的最大内存,你就可以限制它以防止恶意代码影响其他应用程序。使用这些标志,如-Xmx512M,其中M代表MB。如果不包含它,则指定字节。几个标志使用这种格式。您还可以通过设置最小值来获得较小的启动性提升,因为它不必立即增加堆。

-XX:MaxPermSize = ### M设置最大“永久代”大小。 Hotspot是不寻常的,因为几种类型的数据存储在“永久代”中,这是堆的一个单独的区域,很少(或从不)被垃圾收集。 perm-gen托管数据列表有点模糊,但它通常包含类元数据,字节码,实习字符串等内容(这在Hotspot版本中肯定会有所不同)。因为很少或从未收集过这一代,你可能需要增加它的大小(或者用其他几个标志打开perm-gen扫描)。在JRuby中,我们生成了很多适配器字节码,通常需要更多的perm gen空间。

答案 3 :(得分:5)

如何在从Eclipse运行时为程序提供更多内存

转到“运行/运行配置”。选择程序的运行配置。单击“参数”选项卡。在“程序参数”区域中,添加-Xmx参数,例如-Xmx2048m,以便为程序提供最大值。 2048 MB(2 GB)内存。

如何预防此内存问题

以不需要在内存中存储如此多数据的方式重新编写程序。我没有详细查看您的代码,但看起来您在HashMap中存储了大量数据;当你有很多记录时,你会记忆犹新。

答案 4 :(得分:2)

您可能希望在Project Explorer中关闭打开的项目。您可以通过右键单击打开的项目,然后选择&#34;关闭项目&#34;来执行此操作。

在我注意到我必须定期增加my_directory \ eclipse \ eclipse.ini中的堆大小之后,这对我有用。

希望这有帮助!和平!

答案 5 :(得分:1)

要在eclipse中增加堆大小,请更改eclipse.ini文件。

参考

http://wiki.eclipse.org/FAQ_How_do_I_increase_the_heap_size_available_to_Eclipse%3F

答案 6 :(得分:1)

您可以通过使用命令行参数来增加内存的大小。

请参阅this link

eclipse -vmargs -Xmx1024m

修改:另请参阅see this excellent question

答案 7 :(得分:1)

在eclipse.ini文件中,输入以下条目

-Xms512m

-Xmx2048m

-XX:MaxPermSize参数=1024米

答案 8 :(得分:0)

  

如果我需要处理超过500000条记录该怎么办?

有几种方法可以增加您的应用程序的Java堆大小,其中一些已经建议。您的应用需要从您的adddressMap中删除元素,因为您的应用会在其中添加新元素,因此如果有更多记录,您将不会遇到oom。如果您感兴趣,请查找生产者 - 消费者。

答案 9 :(得分:0)

我不是Java的专家,但你的问题可以通过&#34; blockingqueue&#34;来解决。如果你明智地使用它。

首先尝试检索一大块记录,处理它们并迭代该过程,直到完成处理。这可以帮助您摆脱OutOfMemory Exceptions

答案 10 :(得分:0)

在Eclipse goto Run-&gt; Run Configuration中找到您正在运行的类的名称,选择它,单击Target选项卡,然后在“Additional Emulator Command Line Options”中添加:

-Xms512M -Xmx1524M

然后点击“应用”。

答案 11 :(得分:0)

转到&#34;窗口 - &gt;偏好 - &gt;一般 - &gt; C / C ++ - &gt;代码分析&#34; 并禁用&#34;语法和语义错误 - &gt;抽象类无法实例化&#34;

答案 12 :(得分:0)

有时在eclipse ini文件中增加内存后异常不会停止。然后尝试以下选项

转到窗口&gt;&gt;偏好设置&gt;&gt; MyEclipse&gt;&gt; Java Enterprise Project&gt;&gt; Web项目&gt;&gt;部署选项卡 在 - &gt;下在库部署策略下 取消检查 - &gt;用户库中的罐子

答案 13 :(得分:0)

公认的修改运行配置的解决方案对我来说并不理想,因为我有一些不同的运行配置,将来添加更多配置时,很容易忘记这样做。我也希望该设置在运行任何内容时都适用,例如通过右键单击并选择“运行方式”->“ JUnit测试”来运行JUnit测试时。

以上内容可以通过修改JRE / JDK设置来实现:-

  1. 转到窗口->首选项。
  2. 选择Java->已安装的JRE
  3. 选择默认的JRE(可以是JDK),然后单击“编辑...”
  4. 根据需要更改“默认VM参数”值,例如-Xms512m -Xmx4G -XX:MaxPermSize=256M

答案 14 :(得分:0)

请确保您的代码正确。我也曾经陷入这个问题,并尝试了这里接受的解决方案,但是徒劳。因此,我再次编写了代码。显然我正在使用自定义数组列表并添加数组中的值。我尝试将ArrayList更改为仅接受原始值,并且可以正常工作。

相关问题