好吧我用Jsoup 1.8.1做了一个爬虫。昨天我运行它,5-6小时后它给出了内存异常。今天也发生了同样的事情。它工作了几个小时,爬了5000多页,然后给出了内存异常。
在
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)
如果我再次运行爬虫,它能够轻松地再次抓取相同的页面。我的情况是异常不依赖于页面。页面大小也低于200KB。
这是因为我使用的递归函数还是我不知道的一些记忆内容?
答案 0 :(得分:0)
好的,我在Eclipse Memory Analyzer工具的帮助下找到了java.lang.OutOfMemoryError:Java堆空间的原因。它表明数据库连接对象正在增长。我使用静态连接变量,并希望它可以节省内存,但它没有发生。所以现在我删除了对所有未使用的数据库连接的引用。 虽然我仍然没有以正确的方式做到这一点,但至少它现在不会失去记忆。
答案 1 :(得分:0)
我找到了一个可能适合您的一些问题的解决方法。
在我的情况下,在刮掉100Kwww之后,我曾经遇到内存问题,java堆等等,程序总是停止。我一次又一次地检查了代码,按照最佳实践,关闭了连接,最后我放弃了,我从bash那里得到了一些帮助。
基本上我编写了一个运行java -jar myscraper.jar的bash脚本,以便只废弃100Kwww。之后,当Java完全废弃第一组100Kwww时,bash脚本会启动下一组,依此类推。
也许不是最好的,但对我而言,只有在没有记忆问题的情况下废弃4Mwww /天的唯一方法。