2012-08-15 126 views
16

我有一個Web應用程序,它在某處存在內存泄漏,我無法檢測到它。我已經嘗試了通常效果很好的Chrome開發人員工具,但是我無法追查那些有責任的代碼行。 Chrome工具只是給了我太多的信息,我無法將內存中的對象與我的代碼聯繫起來。查找JavaScript內存泄漏的工具

還有其他工具可能有幫助嗎?

+0

[用於在JavaScript調試內存泄漏工具]的可能重複(http://stackoverflow.com/questions/3573252/tools-for-debugging-memory-leaks-in-javascript) – 2012-08-15 12:14:17

回答

22

更新: 允許使用記錄堆分配配置文件類型。

  1. 開放devtools探查
  2. 做熱身動作
  3. 開始探查
  4. 重複操作幾次
  5. 如果操作有泄漏,您將看到相同數量的藍色組總覽窗格中的小節
  6. 停止分析器
  7. 在概覽中選擇一組這些藍色條
  8. 考慮對象

見截屏Javascript Memory Leak detection (Chrome DevTools)

的名單: 您可以使用下一個場景的細化內存泄漏。

  1. 開放devtools探查
  2. 做一個動作,使泄漏
  3. 採取堆快照
  4. 重複步驟2和3棵樹次
  5. 選擇最新的堆快照
  6. 更換過濾器「所有對象「到」快照1和2之間的對象「

之後,您w生病看到對象是一組泄漏的對象。 您可以選擇一個對象,然後查看Object的保留樹中的保持器列表

+3

你如何追溯到你的代碼保留? – thecountofzero 2013-04-12 03:13:23

+0

通常你只是知道誰將泄漏的對象添加到容器中,因爲它是你的代碼。但是,如果你不知道這一點,那麼你可以用泄漏的對象類的新構造函數覆蓋構造函數,該類會記錄堆棧跟蹤,並從控制檯調用原始的構造函數。重複這些步驟並查看分配堆棧跟蹤的對象。它可以給你一個線索,泄漏對象的來源是什麼,以及哪個代碼應該刪除對泄露對象的最後崇拜。 – loislo 2013-04-14 08:02:07

2

使用Detached DOM tree視圖中元素的innerHTML和outerHTML值來將內存中的對象映射到您的代碼並追蹤內存泄漏。

+0

jQuery的AJAX請求是在我的應用程序中最大的罪魁禍首。找到所有的ajax jQuery函數:.ajax(),.get(),.post()和內容制定者:.html(),.text()。轉到開發工具中的網絡選項卡,刷新當前頁面10到20次。我解決了最近jQuery.load()在我的單頁JS應用程序內存泄漏... 'if(!jQuery.terms_html) \t \t \t $('#tc_container')。load(STATIC_DOMAIN +)/ terms。 HTML」,函數(){ \t \t \t \t jQuery.terms_html = $( '#tc_container')。HTML() \t \t \t}) \t \t其他 \t \t \t $( '#tc_container')。HTML (jQuery.terms_html)' – 2018-02-21 07:57:54

0

jQuery ajax請求是我應用程序中最大的罪魁禍首。找到所有的ajax jQuery函數:.ajax(),.get(),.post()和內容制定者:.html(),.text()。

轉到開發工具中的網絡選項卡,刷新當前頁面10到20次。如果您看到堆疊太頻繁,或者調用沒有完成,則會發生內存泄漏。

這是我能用jQuery.load()解決的最近的內存泄漏...

if(!jQuery.terms_html) $('#tc_container').load(STATIC_DOMAIN + '/terms.html', function() { jQuery.terms_html = $('#tc_container').html() }) else $('#tc_container').html(jQuery.terms_html)

另外,jQuery的在寫這個的時候最新版本是3.3.1 。如果可能,安裝最新版本是最好的入門方式。 https://github.com/jquery/jquery/releases