我正在撰写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();
}
答案 0 :(得分:0)
你的代码中的问题是你使用了一个不是最佳的新String,而且你有一个无限循环导致你的堆结束。
在while循环中你永远不会改变变量'page'的值,因为当你跳过你调用break时,你将每次跳过它。