[英]Chrome memory heap is just 10 MB but the task manager shows 500 MB
[英]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.