1. Tomcat6.0.26
2. 页面抓取工具 WebClient
3. tomcat运行环境 :默认参数
工具:JProfiler 6.0.3
方法:在真实生产环境下启动爬虫,使用JProfiler监测该爬虫节点具体运行情况。
1. 关闭tomcat时报错。(MYSQL JDBC或XXX线程无法关闭可能导致memory leek。)
2. 运行时内存溢出。(Exception in thread "Thread-127" java.lang.OutOfMemoryError: PermGen space)
3. Redeploy时内存溢出(java.lang.OutOfMemoryError: PermGen space)
1. 关闭tomcat时报错:
6.0.26版本之后的tomcat会在自身关闭时,强制关闭第三方线程。这时会给出“友情”提示,报错“可能产生内存溢出”。而jdbc等第三方jar提供者尚未针对新版本做集成,所以该现象属正常。对于WEB应用完全无碍。
2. 运行时内存溢出:
JVM的运行时内存分为多个区域。PermGen区称为永久保存区。其用于保存程序运行过程中所有的类信息(作为“反射”等功能的语言支撑环境),默认为4MB。在大型工程,尤其是SSH+大量第三方jar包的环境下,由于要提供AOP、IOC等特性,可能会动态生成类,极可能造成该内存区溢出(见下图,呈缓慢上升趋势),但这种类的数量是有上限的。所以一般情况下只需要将该区域手动扩大(设置相关参数),则可以满足要求。
JVM类占用内存示意图
3. Redeploy时内存溢出:
原因同上。
1. WebClient工具多线程不安全!而现在代码中是每个网站爬虫分别享有一个实例,所以并发时出错。
2. 在异常或者爬虫结束时没有释放WebClient!使用WebClient的getPage函数时,若启用了JavaScript,则会单独起一个JavaScript运行线程。在使用完毕后若不对其进行手动清理(调用closeAllWindows()函数)则该JavaScript线程会一直存在并占用资源。见下图中的JavaScriptJob1。
以上资料来源于HtmlUnit官网API说明,见
http://htmlunit.sourceforge.net/apidocs/com/gargoylesoftware/htmlunit/WebClient.html
线程生命期示意图
根据分析,应用层能进行垃圾回收。峰值有上限,不存在代码级Heap溢出问题。见下图(中间停滞阶段为服务器停了,可以忽略):
内存使用示意图
现有爬虫架构完全可以适用,只需修改配置,并按照正确的方法使用第三方工具