簡體   English   中英

解釋chrome任務管理器中的內存使用情況

[英]Interpretation of memory usage in chrome task manager

我從一個大型java腳本應用程序中的內存泄漏調查開始,該應用程序在基於webkit和sfx(java腳本核心引擎)的瀏覽器中作為小部件運行。 過了一會兒,我發現內存的來源隨着時間的推移而增加。 碰巧是$.ajax(..)

好吧,我想,讓我們嘗試不同版本的jquery或直接使用XMLHttpRequest - 相同的結果。 然后我在谷歌瀏覽器上檢查它並感到驚訝,因為堆分析器既沒有顯示js對象數量的增加也沒有增加堆大小,而chrome任務管理器顯示內存和私有內存增加。 我測試的代碼如下:

var Main = {};
var xhr = new XMLHttpRequest();

function makeRequest() {
    xhr.timeout = 2000;
    xhr.ontimeout = function() {
        xhr.abort();
    }
    xhr.onreadystatechange = function() {
        if (xhr.readyState != 4) return;
    };

    xhr.open("POST", "", true); //async post request to local server
    xhr.send("{}");
}

Main.onLoad = function()
{
    setInterval(function() { makeRequest(); }, 3000);
}

那么,這種行為可以嗎? 這不是本機內存泄漏的跡象嗎?

PS我在Windows 7企業版上使用版本為35.0.1916.153的chrome。

根據規范 ,xhr不會自動GC'd。

4.2垃圾收集

如果XMLHttpRequest對象的狀態為OPENED並且設置了send()標志,其狀態為HEADERS_RECEIVED,或者其狀態為LOADING,並且它具有一個或多個已注冊類型為readystatechange,progress的事件偵聽器,則不得對其進行垃圾回收。中止,錯誤,加載,超時和loadend。

如果XMLHttpRequest對象在其連接仍處於打開狀態時進行了垃圾回收,則用戶代理必須終止該請求。

本文對此問題和類似問題進行了很好的解釋。 通常的解決方法是在xhr.send()之后通過xhr = null清除對回調中宿主對象的引用。 我說通常的修復,因為你沒有分配更多的xhr對象或在這個例子中對結果做任何事情。 如你所說,堆沒有改變,看起來你沒有泄漏。

單獨使用chrome任務管理器無法告訴您是否有泄漏。 我發現這篇文章是關於如何使用chrome的devtools來診斷內存泄漏的有用教程。 您需要手動觸發GC並驗證內存不會持續增長。 如果您發現確實存在內存泄漏,則可以使用devtools來確定哪些對象不屬於保留路徑,但仍在內存中(有關如何在該文章中執行此操作的詳細信息)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM