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

che*_*tan 48 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();
}
Run Code Online (Sandbox Code Playgroud)

这里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)
Run Code Online (Sandbox Code Playgroud)

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

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

Pau*_*ett 149

在Run-> Run Configuration中,找到您正在运行的类的Name,选择它,单击Arguments选项卡,然后添加:

-Xms512M -Xmx1524M

到VM Arguments部分

  • 我只能在左侧看到项目的名称,没有任何类名称或参数选项卡的选项,你能帮助我摆脱这个问题,谢谢. (2认同)

Swa*_*ika 40

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

--launcher.XXMaxPermSize
512M
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx1024m
Run Code Online (Sandbox Code Playgroud)

或者你想要的东西.

  • 对于那些想知道eclipse.ini文件在Mac上的位置,请运行:`$ cd/Applications/eclipse /; 找 .| grep eclipse.ini` (3认同)

Roc*_*kyJ 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空间.


Jes*_*per 5

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

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

如何防止这种记忆问题

重新编写程序,使其不需要在内存中存储如此多的数据.我没有详细查看过您的代码,但看起来您正在存储大量数据HashMap; 当你拥有大量记录时,它不仅仅适合记忆.