javascript - 这是 Xpath 评估中的 Chrome 错误吗

标签 javascript google-chrome xpath

打开此页面:http://sunnah.com/abudawud/2

然后在控制台中运行这个简单的 xpath 搜索查询。然后浏览器选项卡崩溃

for(var k=0, kl=2000; k < kl; k++){
    console.log(k);
    var xpathResult = document.evaluate("//div[@class='hello']", document, null, XPathResult.ANY_TYPE, null);
}

Macbook Pro、OSX 10.10.5 上的 chrome 版本 46.0.2490.80(64 位)

不幸的是,我必须在此页面上运行 xpath 数千次才能搜索不同的元素。所以我不能不做那么多电话来评估。

崩溃取决于 xpath 项。对于某些术语,它会崩溃,而对于其他一些术语,它不会。

它在相同的计数上一直失败,所以我认为这不是时间问题或垃圾收集问题。

我没有收到任何错误代码,所以我不确定该去哪里查看。

enter image description here

更新 经过进一步调查,我们认为这是一个合法的 Chrome 错误,或者至少不是释放内存的好方法。发生的情况是,如果您的 xpath 以/或//开头,则搜索上下文将扩展到所有 DOM,并且出于某种原因,chrome 将 DOM 或其他一些中间对象保留在内存中。如果 xpath 确实以 (div/p) 之类的相对路径开头,并且搜索范围(第二个参数)设置为 DOM 的一部分,则内存消耗更加合理并且不会发生崩溃。感谢@JLRishe 提供的一些提示,这些提示对得出这个结论非常有帮助。

更新2 我在 Chrome 上提交了一个错误。但几个月后,他们拒绝了该错误,认为该错误不会修复。我暂时设法解决了这个问题。

最佳答案

如果我在该页面上运行您的代码并观察任务管理器,我可以看到 Chrome 的工作集增加到大约 3.3 GB,然后在大约 1300 次迭代后最终崩溃。

每个 XPath 查询都会导致 Chrome 为结果和获取结果所涉及的任何操作分配内存,但它似乎没有释放任何已分配的内存,因为您没有释放对线程的控制。

我发现工作集在 1.65 GB 时稳定下来,如果我这样做,操作会在没有崩溃的情况下完成:

var k = 0;
var intv = setInterval(function () {
    console.log(k);
    var xpathResult = document.evaluate("//div[@class='hello']", document, null, XPathResult.ANY_TYPE, null);
    k += 1;
    if (k >= 2000) {
        clearInterval(intv);
    }
}, 0);

所以类似的东西可能是一个可能的解决方案。

这仍在使用大量系统资源,而且这甚至不包括您在操作过程中可能存储的任何值。我鼓励您寻找一种不需要运行太多 XPath 查询的更智能的方法。

关于javascript - 这是 Xpath 评估中的 Chrome 错误吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33452651/

相关文章:

javascript - JavaScript 中当前脚本的 URL

javascript - 将元组拆分为两个变量

javascript - 如何使用 sequelize/mysql 删除特定实例的关系

javascript - SpeechSynthesisUtterance 在 Chrome 中因多次调用而崩溃

Javascript 一次设置 Var

xml - XSL+XPATH : Compare previous node attribute to current node attribute

Javascript Google 风格分页菜单

javascript - SVG 图案元素不会在 Chrome 中调整大小

xslt 1.0,字符串长度函数

xml - 如何在perl中使用xpath分割xml?