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

java.lang.OutOfMemoryError:java堆空间(StringBuffer),java,out-of-memory,heap,Java,Out Of Memory,Heap,我正在写一个谷歌游戏商店的爬虫。My method visit(link)在字符串页面中获取html代码,并通过重新调用visit(link)的方法searchApp(Page)访问链接到该页面的所有其他应用程序。但我离开了记忆,找不到解决办法。我不会增加JVM堆的大小。我怎样才能修好它 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOfRang

我正在写一个谷歌游戏商店的爬虫。My method visit(link)在字符串页面中获取html代码,并通过重新调用visit(link)的方法searchApp(Page)访问链接到该页面的所有其他应用程序。但我离开了记忆,找不到解决办法。我不会增加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)
线程“main”java.lang.OutOfMemoryError中的异常:java堆空间 位于java.util.Arrays.copyOfRange(Arrays.java:2694) 位于java.lang.String。(String.java:203) 位于java.lang.StringBuffer.toString(StringBuffer.java:561) 位于java.io.BufferedReader.readLine(BufferedReader.java:352) 位于java.io.BufferedReader.readLine(BufferedReader.java:382) 在Main.visita(Main.java:34) at Main.cercaApp(Main.java:83)

公共静态无效访问(字符串链接){
试一试{
URL my_URL=新URL(链接);
BufferedReader br=新的BufferedReader(新的InputStreamReader(my_url.openStream());
字符串strTemp;
StringBuilder=新的StringBuilder();
while(null!=(strTemp=br.readLine()){
append(新字符串(strTemp.trim());
}
br.close();
字符串页=新字符串(builder.toString());
builder=null;strTemp=null;
gc();
page=page.toLowerCase();
searchApp(第页);
page=null;System.gc();
} 
捕获(例外情况除外){
返回;
}
}
公共静态无效搜索应用程序(字符串页){
int i=0,j=0,k=0;
字符串链接=新字符串(“”);
while(true){
i=page.indexOf(“/store/apps/details?”,i);
如果(i==-1)
打破
j=第页索引of(“\”,i);
k=第页索引(“&”,i);

如果(k代码中的问题是,您使用的新字符串不是最优的,并且将来有一个无限循环会导致堆结束


在while循环中,您永远不会更改变量“page”的值,因为当跳过调用break的if时,您每次都会跳过它。

可能重复我添加了所有这些新字符串()的声明试图解决问题,但没有任何改变。您应该删除它们并按照注释中的建议增加可用内存。我自己解决了它。这足以从两个方法中删除递归循环并在main()中创建一个迭代。
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();
}