问题背景:
最近一个爬虫类的项目,在自测时发现CPU占用异常高(2核4G 10个URL/s的速率爬取),几乎是打满了,所以开始去排查过高的原因
找到阻塞的线程
通过jconsole来分析
可以看到 pool-1070-thread-3 线程的总阻止数为 82,说明是阻塞在了该线程,从而定位到代码:
public XPath(Element el) {
String tagName = el.tagName();
Element parent = el.parent();
this.selfElement = el;
if (parent != null && !parent.tagName().toLowerCase().matches("html")) {
Elements childrenList = parent.children();
//父节点下有子节点
if (CommonUtils.isNotNull(childrenList)) {
int inx = 0;
//按序遍历该节点的父节点下的所有子节点,用于标注出当前节点的下标,div[2]
for (Element child : childrenList) {
if (StringUtils.equals(selfElement.toString(), child.toString()) && tagName.equalsIgnoreCase(child.tagName())) {
this.index = inx;
break;
} else if (tagName.equalsIgnoreCase(child.tagName())) {
//相同的tag下标才+1
inx++;
continue;
}
}
}
//向上递归的方式初始化,直到html
this.parent = new XPath(parent);
}
this.tagName = tagName;
}
发现这里没必要用element的toString方法来判断,当前节点与兄弟节点是否相等。直接用 == 判断即可。
修改后,问题解决,cpu消耗正常