memory-leaks - HTTPClient 的漏洞在哪里
问题描述
我已经解决这个问题好几天了,仍然无法找出问题所在。
HTTPClient 没有被正确清理,因此当循环下载 100 个图像时,应用程序内存正在爆炸。
我正在使用 appc new -t 钛创建的简单合金模板进行测试。
只用一个按钮打开一个索引视图来开始下载循环
我的索引文件如下所示:
var max = 100
var i = 0
var c = Ti.Network.createHTTPClient();
c.onerror = function () {
c = null;
}
c.onload = function () {
saveFile(this.responseData)
console.log("done get")
i++
getfiles()
}
function getfiles () {
if (i < max) {
try {
c.open('GET', "https://cdn.fossilswitzerland.ch/large0/FS4931.jpg");
c.send();
} catch (e) {
}
} else {
c = null
console.log("finished")
}
}
function saveFile (response) {
console.log("STORING")
var f = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, 'FS4931.jpg');
f.write(response);
if (f.exists() === false) {
console.log("NOT STORED")
} else {
console.log("STORED")
}
f = null;
}
$.index.open();
最初在应用程序启动后,内存位于 ca。30mb 到目前为止这么好单击索引页面上的获取图像按钮后,内存上升到 ca。62mb 然后过一段时间下降到 ca。50mb 留下 20mb 下落不明
我正在使用:Xcode 10.3 Ti SDK 版本 8.1.1.GA 模拟器:iPad Pro(第 2 代)在 12.4
将 max 更改为 1000 时,内存飙升至 322mb 左右,并且似乎不再减少。
当循环下载 2000 张图片时,这是一个非常大的问题,因为应用程序在某个时候会崩溃
感谢您的任何帮助
解决方案
我对代码进行了一些更改(for-loop,使用file
属性,不要重复使用 httpclient(查看文档),经典代码,因此测试速度更快):
var w = Ti.UI.createWindow();
var b = Ti.UI.createButton({
title: "download"
});
w.add(b);
function onError(e) {
console.log("error", e);
}
function onLoad(e) {
console.log("done get")
}
function getfiles(e) {
for (var i = 0; i < 100; ++i) {
var c = Ti.Network.createHTTPClient({
onerror: onError,
onload: onLoad
});
c.open('GET', "https://cdn.fossilswitzerland.ch/large0/FS4931.jpg");
var fname = Ti.Filesystem.applicationSupportDirectory + "/" + (new Date().getTime()) + ".jpg";
console.log("Download to", fname);
c.file = fname;
c.send();
c = null;
fname = null;
}
}
b.addEventListener("click", getfiles);
w.open();
当它释放内存(大约 5mb)时,我得到了一点开销。您可以创建 JIRA 票证 ( https://jira.appcelerator.org/ ),以便他们检查。
推荐阅读
- javascript - API Fetch 问题:未处理的承诺拒绝:SyntaxError:JSON 解析错误:意外的标识符“服务器”
- azure - 使用 REST API 在 Go 中对 Azure 进行身份验证
- google-bigquery - 无论存储引擎类型如何,它们是否支持单个 DDL 和 DML SQL 语句的事务?
- visual-studio-code - 在当前 VSCode 目录中打开 WSL 终端而不使用 VSCode 服务器
- android - 为什么firebase身份验证返回null?
- python - 使用 Spacy nlp 合并两个 CSV 文件
- c - 如果没有提供其他标志,是否会在 EPOLLERR/EPOLLHUP 上唤醒 epoll?
- django - Django Celery Redis 身份验证
- kubernetes - 将指标移入 Kubernetes 集群
- mongodb - Cosmos DB Mongo API | 间歇性高价查询 | 使用 Mongo 命令 getMore “查找”