QtWebKit 内存泄漏有啥解决办法吗?

Posted

技术标签:

【中文标题】QtWebKit 内存泄漏有啥解决办法吗?【英文标题】:Is there any solution for the QtWebKit memory leak?QtWebKit 内存泄漏有什么解决办法吗? 【发布时间】:2014-01-25 22:37:43 【问题描述】:

QtWebKit 进程的内存大小随着每次新页面加载而增加。清理内存缓存没有帮助。有人知道怎么解决吗?

这个简单的例子在运行一段时间后崩溃:

from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebKitWidgets import QWebView
from PyQt5.QtWebKit import QWebSettings

class Crawler(QWebView):
    def __init__(self):
        QWebView.__init__(self)

        self.settings().setMaximumPagesInCache(0)
        self.settings().setObjectCacheCapacities(0, 0, 0)
        self.settings().setOfflineStorageDefaultQuota(0)
        self.settings().setOfflineWebApplicationCacheQuota(0)
        self.settings().setAttribute(QWebSettings.AutoLoadImages, False)

        self.loadFinished.connect(self._result_available)

    def start(self):
        self.load(QUrl('http://***.com/'))

    def _result_available(self, ok):
        print('got it!')

        self.settings().clearMemoryCaches() # it doesn't help
        self.settings().clearIconDatabase()

        self.start() # next try

if __name__ == '__main__':
    app = QApplication([])
    crawler = Crawler()
    crawler.start()
    app.exec_()

【问题讨论】:

并非如此。这似乎是 webkit 的一个有点令人费解的“功能”(有关一些讨论,请参阅 here)。一个相当难看的解决方法是定期启动一个新进程,以便系统可以回收内存。 【参考方案1】:

禁用自动加载图像时内存泄漏的原因。这是一个bug,将在下一个 QT 版本中修复。删除此行可以解决上述问题:

self.settings().setAttribute(QWebSettings.AutoLoadImages, False)

可能导致泄漏的第二个可能原因是"Memory leak in GStreamer"。正在处理中。

更新:

我看到人们仍在寻找解决方案。我最近注意到 AutoLoadImages=False 的错误在 Qt 5.2.1 和 Qt 5.3 RC 中都没有修复。 New discussion about it has been opened. 您可以在 bugtracker 中为这个问题投票,以增加在 Qt 5.3.0 中修复的机会

【讨论】:

以上是关于QtWebKit 内存泄漏有啥解决办法吗?的主要内容,如果未能解决你的问题,请参考以下文章

Android性能优化之利用LeakCanary检测内存泄漏及解决办法(转)

Android开发常见的Activity中内存泄漏及解决办法

Android开发常见的Activity中内存泄漏及解决办法

Linux 当jmeter压测时,JVM内存泄漏,端口不够问题,解决办法

闭包的内存泄漏解决办法

Webview内存泄漏解决办法2