• htmlunit 导致高cup占用,一老内存溢出的解决办法


    原文:http://blog.csdn.net/qq_28384353/article/details/52974432#reply  

    将爬虫部署到服务器上运行后,在查看服务器的状态监控时发现,天猫爬虫执行一段时间后,CPU占用异常升高,内存也跟着爆炸,虽然程序没有中断,但是爬取速度已经变成龟速。查看日志,发现抛出了Java.lang.OutOfMemoryError: Java heap space异常。

    在服务器上通过jstack查到占用CPU最严重的五个线程里有四个竟然都是htmlunit下的webclient。

    Google后找到原因,罪魁祸首是webclient创建后始终没有关闭,导致分配的内存始终无法被GC回收,最终引起outofmemory。

    解决方法为在当前webclient使用结束后立即执行webclient.close(),或者设定在爬取一定次数后关闭webclient,虽然会对性能有一定影响,但是解决了内存泄漏的问题。

    ==================================  分隔符  ===================================================

    虽然知道HtmlUnit中一老内存溢出的原因,也给出了一种解决方法,就是使用完webClient之后就释放webClient对象,但是这只适用于单网页,url列表抓取的情况,如果你要是想抓取像列表详情页或者有下一页这样的情况,如果关闭了webclient,会导致原网页数据清空,无法执行下一页等各种情况。

    解决方案:像列表详情页这样的抓取情况,可以在抓取到详情页连接之后,在创建一个webClient对象,通过详情页链接地址,使用webClient.getPage("详情页链接");获取详情页的page

    之后就可以在详情页上抓取需要的数据,抓取完事之后,关闭wenClient对象。进行下一个详情页数据的抓取,这样就解决了使用htmlUnit一老出现内存溢出的问题 。

  • 相关阅读:
    hdu 1408 acdearm "Money, Money, Money"
    hdu 1284 钱币兑换问题
    hdu 1248 寒冰王座
    hdu 1203 I NEED A OFFER!
    acdream 1726 A Math game
    csu 1640 机智的刷题方式(完全背包)
    NYOJ 734 奇数阶魔方
    bestcoder Round #79 (div.2)jrMz and angles
    南阳oj 题目6 喷水装置(一)
    小区的路
  • 原文地址:https://www.cnblogs.com/cmyxn/p/6480157.html
Copyright © 2020-2023  润新知