簡體   English   中英

如何確定垃圾收集器正在收集哪些對象?

[英]How can I determine what objects are being collected by the garbage collector?

我有重要的垃圾收集暫停。 在嘗試解決問題之前,我想確定最負責此集合的對象。 我已經查看了Chrome上的堆快照,但是(如果我錯了,請糾正我)我似乎無法找到任何正在收集的內容的指標,只是占用了大部分內存。 有沒有辦法根據經驗回答這個問題,還是僅限於有根據的猜測?

在chrome配置文件中需要兩個堆快照,一個在執行您要檢查的操作之前,另一個在之后。

現在單擊第二個快照。

在底部欄上,您將看到帶有“摘要”選項的選擇框。 將其更改為“比較”。

然后在它旁邊的選擇框中選擇要比較的快照(它應該自動選擇snapshot1)。

根據結果​​,您將獲得所需數據表,即。 “新建”和“已刪除”對象。

對於較新的Chrome版本,有一種新工具可用於此類任務:

“記錄堆分配”概要分析類型。 常規的“Heap SnapShot”比較工具(如RafałŁużyński答案中所述)無法提供這種信息,因為每次執行堆快照時,都會執行GC運行,因此GCed對象永遠不會成為快照的一部分。 但是,通過“記錄堆分配”工具,不斷記錄所有分配(這就是為什么它在錄制時可能會大大減慢您的應用程序的速度)。 如果您經常進行GC運行,此工具可以幫助您識別代碼中分配了大量內存的位置。 結合Heap SnapShot比較,您將看到大多數時間在兩個快照之間分配的內存比從比較中看到的要多得多。 在極端情況下,比較根本不會產生任何差異,而分配工具將向您顯示大量分配的內存(顯然必須在此期間進行垃圾回收)。

不幸的是該工具的當前版本不告訴你在哪里分配發生,但它會告訴你什么是已分配和它是如何被保留在分配的時間。 然而,從數據(可能還有構造函數)中,您將能夠識別對象,從而識別它們的分配位置。

如果您嘗試在幾個可能的罪魁禍首之間進行選擇,您可以修改對象定義以將自己附加到全局范圍(作為文檔下的列表或其他內容)。 然后這將阻止它們被收集。 這可能使程序更快(它們不被回收)或更慢(因為它們建立並且每次都通過標記和掃描進行檢查)。 因此,如果您發現性能發生了變化,您可能已經發現了問題。

另一種方法是查看每種類型創建的對象數量(在構造函數中設置計數器)。 如果它們被收集了很多,它們也會被頻繁地創建。

請查看https://developers.google.com/chrome-developer-tools/docs/heap-profiling

特別是遏制視圖

Containment視圖本質上是應用程序對象結構的“鳥瞰圖”。 它允許您查看內部函數閉包,觀察組成JavaScript對象的VM內部對象,以及了解應用程序在非常低級別使用的內存量。

該視圖提供了幾個入口點:

DOMWindow對象 - 這些對象被視為JavaScript代碼的“全局”對象; GC根源 - VM垃圾收集器使用的實際GC根 ; 本機對象 - 在JavaScript虛擬機內“推送”以允許自動化的瀏覽器對象,例如DOM節點,CSS規則(有關更多詳細信息,請參閱下一節。)以下是包含視圖的示例:

在此輸入圖像描述

暫無
暫無

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

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