java.lang.OutOfMemoryError:Java堆空间(StringBuffer)

时间:2014-03-03 21:29:39

标签: java out-of-memory heap

我正在撰写Google Play商店的抓取工具。我的方法访问(链接)将字符串页面中的html代码和访问链接到该页面的所有其他应用程序通过重新调用访问(链接)的方法searchApp(页面)。但我得到OutOfMemoyError,我找不到解决方案。我不会增加JVM堆大小。我该如何解决?

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOfRange(Arrays.java:2694)
    at java.lang.String.<init>(String.java:203)
    at java.lang.StringBuffer.toString(StringBuffer.java:561)
    at java.io.BufferedReader.readLine(BufferedReader.java:352)
    at java.io.BufferedReader.readLine(BufferedReader.java:382)
    at Main.visita(Main.java:34)
    at Main.cercaApp(Main.java:83)

public static void visit(String link)  {
    try {
        URL my_url = new URL(link);
        BufferedReader br = new BufferedReader(new InputStreamReader(my_url.openStream()));
        String strTemp;
        StringBuilder builder= new StringBuilder();

        while(null != (strTemp =br.readLine())){
            builder.append(new String(strTemp.trim()));
        }
        br.close();
        String page = new String(builder.toString());
        builder=null; strTemp=null;
        System.gc();
        page =page.toLowerCase();

        searchApp(page);
        page=null; System.gc();
    } 

    catch (Exception ex) {
        return;
    }

}


public static void searchApp(String page){
    int i=0, j=0, k=0;
    String link=new String ("");
    while(true){
        i=page.indexOf("/store/apps/details?",i);
        if(i==-1)
            break;
        j=page.indexOf("\"",i);
        k=page.indexOf("&",i);
        if(k<j)
            j=k;
        k=page.indexOf("<",i);
        if(k != -1 && k<j)
            j=k;
        k=page.indexOf(")",i);
        if(k != -1 && k<j)
            j=k;

        try{
            link=new String("https://play.google.com"+page.substring(i,j));
            if(!(link.contains("%") || link.contains("\\"))){

                if (!linkVisited.contains(link))
                {
                    linkVisited.add(new String(link));
                    System.out.println("ADDED : ");
                    System.out.println(link);
                    visita(link);
                }
            }
            i=j;
        }
        catch(StringIndexOutOfBoundsException e){
            break;
        }
    }
    page=null;
    System.gc();
}

1 个答案:

答案 0 :(得分:0)

你的代码中的问题是你使用了一个不是最佳的新String,而且你有一个无限循环导致你的堆结束。

在while循环中你永远不会改变变量'page'的值,因为当你跳过你调用break时,你将每次跳过它。