java.lang.OutOfMemoryError:java堆空间(StringBuffer)
我正在写一个谷歌游戏商店的爬虫。My method visit(link)在字符串页面中获取html代码,并通过重新调用visit(link)的方法searchApp(Page)访问链接到该页面的所有其他应用程序。但我离开了记忆,找不到解决办法。我不会增加JVM堆的大小。我怎样才能修好它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
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();
}