Java 爬虫程序工作数小时后出现Jsoup内存不足错误

Java 爬虫程序工作数小时后出现Jsoup内存不足错误,java,jsoup,Java,Jsoup,我用JSOUP1.8.1制作了一个爬虫。昨天我运行了它,5-6个小时后它出现了内存不足异常。今天也发生了同样的事情。它工作了几个小时,爬网了5000多页,然后出现了内存不足的异常 在 doc=Jsoup.connect(page_url).timeout(10*1000.get(); 线程“main”java.lang.OutOfMemoryError中出现异常:java堆空间 位于java.util.Arrays.copyOfRange(Arrays.java:2694) 位于java.lan

我用JSOUP1.8.1制作了一个爬虫。昨天我运行了它,5-6个小时后它出现了内存不足异常。今天也发生了同样的事情。它工作了几个小时,爬网了5000多页,然后出现了内存不足的异常

doc=Jsoup.connect(page_url).timeout(10*1000.get();
线程“main”java.lang.OutOfMemoryError中出现异常:java堆空间
位于java.util.Arrays.copyOfRange(Arrays.java:2694)
位于java.lang.String。(String.java:203)
位于org.jsoup.parser.CharacterReader.ConsumeTAny(CharacterReader.java:133)
位于org.jsoup.parser.TokeniserState$38.read(TokeniserState.java:779)
位于org.jsoup.parser.Tokeniser.read(Tokeniser.java:42)
位于org.jsoup.parser.TreeBuilder.runParser(TreeBuilder.java:47)
位于org.jsoup.parser.TreeBuilder.parse(TreeBuilder.java:41)
位于org.jsoup.parser.HtmlTreeBuilder.parse(HtmlTreeBuilder.java:55)
位于org.jsoup.parser.parser.parseInput(parser.java:30)
位于org.jsoup.helper.DataUtil.parseByteData(DataUtil.java:115)
位于org.jsoup.helper.HttpConnection$Response.parse(HttpConnection.java:532)
位于org.jsoup.helper.HttpConnection.get(HttpConnection.java:171)
在classes.CrawlPages.pageInfo(CrawlPages.java:88)
位于classes.CrawlPages.processController(CrawlPages.java:67)
位于classes.CrawlPages.processController(CrawlPages.java:70)
位于classes.CrawlPages.processController(CrawlPages.java:70)
位于classes.CrawlPages.processController(CrawlPages.java:70)
位于classes.CrawlPages.processController(CrawlPages.java:70)
位于classes.CrawlPages.processController(CrawlPages.java:70)
位于classes.CrawlPages.processController(CrawlPages.java:70)
位于classes.CrawlPages.processController(CrawlPages.java:70)
位于classes.CrawlPages.processController(CrawlPages.java:70)
位于classes.CrawlPages.processController(CrawlPages.java:70)
位于classes.CrawlPages.processController(CrawlPages.java:70)
在classes.CrawlPages.readSeed(CrawlPages.java:41)
在classes.StartRun.main(StartRun.java:40)
问题是,如果我再次运行爬虫程序,它可以很容易地再次抓取相同的页面。在我的情况下,异常不依赖于页面。页面大小也低于200KB


这是因为我使用的递归函数还是我不知道的一些内存问题?

好的,我在Eclipse内存分析器工具的帮助下找到了java.lang.OutOfMemoryError:java堆空间的原因。这表明数据库连接对象正在增长。我使用了静态连接变量,希望它能节省内存,但并没有发生。因此,现在我删除了对所有未使用的数据库连接的引用。
尽管我仍然没有用正确的方法来做,但至少它现在没有内存不足。

我找到了一个解决方法,可以解决您的一些问题

在我的例子中,在刮掉大约100Kwww之后,我经常遇到内存问题、java堆等等,程序总是停止。我一次又一次地检查代码,遵循最佳实践,关闭连接,最后我放弃了,并从bash获得了一些帮助

基本上,我编写了一个运行java-jar myscraper.jar的bash脚本,目的是为了只丢弃100Kwww。之后,当Java完全放弃第一组100KWW后,bash脚本开始下一组,以此类推


也许不是最好的,但对我来说,这是在没有内存问题的情况下每天丢弃4Mwww的唯一方法。

我假设您正在摆脱内存错误,因为您正在将正在爬网的所有数据存储在堆上,并且在不断添加数据五个小时后,您的空间不足。爬网的数据在数据库中建立索引,我认为垃圾收集器应该在这之后处理事情。我不是把它堆起来。你是说每天有400万个网页吗?
doc = Jsoup.connect(page_url).timeout(10*1000).get();



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 org.jsoup.parser.CharacterReader.consumeToAny(CharacterReader.java:133)
at org.jsoup.parser.TokeniserState$38.read(TokeniserState.java:779)
at org.jsoup.parser.Tokeniser.read(Tokeniser.java:42)
at org.jsoup.parser.TreeBuilder.runParser(TreeBuilder.java:47)
at org.jsoup.parser.TreeBuilder.parse(TreeBuilder.java:41)
at org.jsoup.parser.HtmlTreeBuilder.parse(HtmlTreeBuilder.java:55)
at org.jsoup.parser.Parser.parseInput(Parser.java:30)
at org.jsoup.helper.DataUtil.parseByteData(DataUtil.java:115)
at org.jsoup.helper.HttpConnection$Response.parse(HttpConnection.java:532)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:171)
at classes.CrawlPages.pageInfo(CrawlPages.java:88)
at classes.CrawlPages.processController(CrawlPages.java:67)
at classes.CrawlPages.processController(CrawlPages.java:70)
at classes.CrawlPages.processController(CrawlPages.java:70)
at classes.CrawlPages.processController(CrawlPages.java:70)
at classes.CrawlPages.processController(CrawlPages.java:70)
at classes.CrawlPages.processController(CrawlPages.java:70)
at classes.CrawlPages.processController(CrawlPages.java:70)
at classes.CrawlPages.processController(CrawlPages.java:70)
at classes.CrawlPages.processController(CrawlPages.java:70)
at classes.CrawlPages.processController(CrawlPages.java:70)
at classes.CrawlPages.processController(CrawlPages.java:70)
at classes.CrawlPages.readSeed(CrawlPages.java:41)
at classes.StartRun.main(StartRun.java:40)