我開發一個應用程序角度和我創建了一個下載頁面這樣的:Angular:併發下載後內存泄漏?
如果我看看Chrome的任務管理器我看到有關我的應用程序的過程中保留約130 MB的記憶。
然後,用戶可以啓動同時下載點擊每一個下載按鈕(總文件大小爲266 MB):
現在,如果我再次檢查任務管理器我看到內存使用情況隨着所有下載完成,其峯值約爲650 MB。 我注意到一個奇怪的事情:所述存儲器的最終用途似乎是總下式:
初始存儲器使用+ 2 *總文件大小=最終內存使用
130 MB + 2 * 266 MB = 130 MB + 532 MB = 662 MB =〜650 MB。
如果我嘗試使用Chrome垃圾回收器,它會切斷約30 MB,但我仍然擁有620 MB作爲內存使用情況的應用程序。 那麼,我該如何解決這個問題呢?你能看到我的代碼有什麼問題嗎? (我曾嘗試對組件的ngOnDestroy
使用unsubscribe
,但它沒有工作)
這是當我在一個文件的下載按鈕,點擊(從下載頁面)被調用的函數:
getFile(file: any): void {
this.fileDownloadService.downloadFile(file).subscribe(
(fileinfo: SispFile) => {
file.downloading = true;
},
(err: any) => {
file.downloading = false;
console.log('errore', err);
},
() => {
file.downloading = false;
console.log('completated');
});
}
這裏是在FileDownloadService
的downloadFile
功能,通過getFile
叫:
downloadFile(file: SispFile): Observable<any> {
let conf: any = {};
conf.totalChunks = Math.max(Math.ceil(file.size/this.chunkSizeDownload), 1);
conf.mime = file.extension;
conf.currentChunk = 0;
conf.byteDownloaded = 0;
conf.chunkSizeDownload = this.chunkSizeDownload;
conf.chunkBlobs = [];
conf.finalBlob = null;
file.progress = 0;
return new Observable(observer => {
observer.next(file);
this.addChunk(file, observer, conf);
})
}
addChunk(file: SispFile, observer: any, conf: any) {
if (conf.currentChunk == conf.totalChunks) {
observer.complete();
conf.finalBlob = new Blob(conf.chunkBlobs, {type: conf.mime});
let fileURL = URL.createObjectURL(conf.finalBlob);
let a = document.createElement("a");
a.href = fileURL;
a.download = file.name;
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(fileURL);
} else {
this.docService.downloadFile(file, conf.chunkSizeDownload, conf.byteDownloaded)
.then(response => {
let typedArray = this.createBlob(response['_body'], conf.mime);
conf.chunkBlobs[conf.currentChunk] = typedArray;
conf.currentChunk++;
conf.byteDownloaded = conf.currentChunk * conf.chunkSizeDownload;
if (conf.Downloaded + this.chunkSizeDownload > file.size) {
conf.chunkSizeDownload = file.size - conf.Downloaded + 1;
}
let progress = Math.round((conf.currentChunk * 100)/conf.totalChunks);
file.progress = progress;
observer.next(file);
this.addChunk(file, observer, conf);
})
.catch((error: ErrorMessage) => {
observer.error(error);
console.log('Errore server: ' + error);
});
}
}
這裏是最終調用後端端點的DocService
:
downloadFile(file: SispFile, length: number, offset: number) {
let url = Util.format(this.downloadFileUrl, {id: file.id});
let body: any = { "downloadMode": "PAYLOAD", "fileId": file.id, "length": length, "offset": offset };
return this.http.post(url, body)
.toPromise()
.then(response => {
return response;
})
.catch(this.handleError);
}
謝謝你的提示。那麼,我該怎麼辦?我發現修復不會合併到Angular主存儲庫。 – smartmouse
@smartmouse我相信你最初可以分叉它並測試它是否能解決你的問題。也許你可以調整分叉庫,直到它適合你的需要。 – SrAxi
如果我嘗試fork,那麼你知道如何清理'TestabilityRegistry'嗎? – smartmouse