zoukankan      html  css  js  c++  java
  • 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一老出现内存溢出的问题 。

  • 相关阅读:
    关于json解析和所需jar
    Solr初步使用
    Appium-desktop使用时的一些配置
    mac电脑安装和配置tomcat步骤
    maven-reportng插件依赖添加
    maven-surefire插件配置
    mac电脑的一些操作
    元素的多种延时等待(&页面的超时处理)
    Mac系统搭建java+selenium+testng环境
    爬虫简介与request模块
  • 原文地址:https://www.cnblogs.com/cmyxn/p/6480157.html
Copyright © 2011-2022 走看看