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中内存泄漏及解决办法