基于TOMCAT的爬虫问题分析报告

环境:

1. Tomcat6.0.26

2. 页面抓取工具 WebClient

3. tomcat运行环境 :默认参数

分析工具及方法:

工具:JProfiler 6.0.3

方法:在真实生产环境下启动爬虫,使用JProfiler监测该爬虫节点具体运行情况。

错误现象:

1. 关闭tomcat时报错。(MYSQL JDBCXXX线程无法关闭可能导致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包的环境下,由于要提供AOPIOC等特性,可能会动态生成类,极可能造成该内存区溢出(见下图,呈缓慢上升趋势),但这种类的数量是有上限的。所以一般情况下只需要将该区域手动扩大(设置相关参数),则可以满足要求。

基于TOMCAT的爬虫问题分析报告_第1张图片

JVM类占用内存示意图

3. Redeploy时内存溢出:

原因同上。

资源爬虫代码问题:

1. WebClient工具多线程不安全!而现在代码中是每个网站爬虫分别享有一个实例,所以并发时出错。

2. 在异常或者爬虫结束时没有释放WebClient!使用WebClientgetPage函数时,若启用了JavaScript,则会单独起一个JavaScript运行线程。在使用完毕后若不对其进行手动清理(调用closeAllWindows()函数)则该JavaScript线程会一直存在并占用资源。见下图中的JavaScriptJob1

以上资料来源于HtmlUnit官网API说明,见

http://htmlunit.sourceforge.net/apidocs/com/gargoylesoftware/htmlunit/WebClient.html

基于TOMCAT的爬虫问题分析报告_第2张图片

线程生命期示意图

tomcat运行时内存占用:

根据分析,应用层能进行垃圾回收。峰值有上限,不存在代码级Heap溢出问题。见下图(中间停滞阶段为服务器停了,可以忽略):

基于TOMCAT的爬虫问题分析报告_第3张图片

内存使用示意图

结论:

现有爬虫架构完全可以适用,只需修改配置,并按照正确的方法使用第三方工具

你可能感兴趣的:(tomcat)