【发布时间】:2020-08-06 06:09:52
【问题描述】:
创建XMLHttpRequest 的new 实例并调用send() 会导致垃圾收集器或gc() 无法清除内存使用情况。在对象上调用delete 也不会清除内存。
import QtQuick 2.12
import QtQuick.Window 2.12
Window {
visible: true
width: 640
height: 480
Component.onCompleted: {
for(var i = 0; i < 100000; i++) {
console.log("Send request " + i)
var xhttp = new XMLHttpRequest
xhttp.open('get', 'someurl')
xhttp.send()
delete xhttp
}
gc() //why won't this clean the instances of XMLHttpRequest???
}
}
如果我从不打电话给xhttp.send(),那么我就没有任何内存泄漏。垃圾收集启动,因为没有引用 var xhttp 并且内存被释放。我想也许垃圾收集器没有触发,但gc() 也不会清除内存。
这个 MRE 将运行 100,000 次迭代并在内存中保存大约 500MB。这可以通过更改为i < 1000000 轻松容纳 5.0GB。
如何修复此内存泄漏并释放内存?
类似问题的参考: QTBUG-43005 (No resolution) QTBUG-50231 (No resolution)
现在记录在QTBUG-83857
在这里,拥有 2.0GB 的内存。它保持了将近 4 个小时,直到我终止了该程序。当我关闭应用程序时,大约 60 秒后,整个 2GB 内存被释放
尝试使用 QNetworkAccessManager 类
//main.qml
MyClass {
id: myNetworkClass
Component.onCompleted: {
for(var i = 0; i < 10000; i++) {
myNetworkClass.doDownload()
}
}
}
//myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDebug>
class MyClass : public QObject
{
Q_OBJECT
public:
explicit MyClass(QObject *parent = 0):QObject(){
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
}
public:
Q_INVOKABLE void doDownload() {
manager->get(QNetworkRequest(QUrl("https://esi.evetech.net/latest/characters/93610700")));
}
public slots:
void replyFinished(QNetworkReply *reply) {};
private:
QNetworkAccessManager *manager;
int count = 0;
};
#endif // MYCLASS_H
不幸的是,根据 htop,这也保留了内存并且不会释放它。
【问题讨论】:
标签: javascript qt memory memory-leaks qml