2015-11-19 34 views
8

我試圖瞭解由google chrome工具生成的堆轉儲的內容。我知道已經有一個瀏覽器內堆轉儲檢查器,但我有興趣編寫一個CLI來解析JS堆轉儲。我無法找到關於堆轉儲內容結構的任何文檔。他們是人類可讀的,但格式不是很清楚,從檢查文件V8 Javascript堆轉儲架構

這裏有一個隨機片段:

"HTMLOptionElement", 
"XMLHttpRequestEventTarget", 
"about:blank", 
"clearModifier", 
"resetModifiers", 
"/devtools/docs/demos/memory/example1", 
"HTMLIFrameElement", 
"https://www.google.com/jsapi?autoload=%7B%22modules%22%3A%5B%7B%22name%22%3A%22search%22%2C%22version%22%3A%221.0%22%2C%22callback%22%3A%22__gcse.scb%22%2C%22style%22%3A%22https%3A%2F%2Fwww.google.com%2Fcse%2Fstyle%2Flook%2Fv2%2Fdefault.css%22%2C%22language%22%3A%22en%22%7D%5D%7D", 
"HTMLLinkElement", 
"HTMLContentElement", 
"window.__SSR = {c: 1.2808007E7 ,si:1,su:1,e:'[email protected]',dn:'Richard Schneeman',a:'bubble',at:'AZW7SXV+1uUcQX+2WIzyelLB5UgBepsr1\\/RV+URJxwIT6BmLmrrThMH0ckzB7mLeFn1SFRtxm\\/1SD16uNnjb0qZxXct8\\x3d',ld:[,[0,12808007,[]\n,1,70]\n]\n,r:'https:\\/\\/developer.chrome.com\\/devtools\\/docs\\/demos\\/memory\\/example1',s:'widget',annd: 2.0 ,bp: {}, id:'http:\\/\\/www.google.com\\/chrome'}; document.addEventListener && document.addEventListener('DOMContentLoaded', function() {gapi.inline.tick('wdc', new Date().getTime());}, false);", 
"onLoaded", 
"HTMLAllCollection", 
"onDocumentKeyDown", 

對鉻堆轉儲存在結構待辦事項文檔?有沒有標準的JavaScript堆轉儲格式或每個引擎都有自己的專有標準?

+1

不幸的是,沒有像標準JS堆格式那樣的東西。快速搜索「v8堆轉儲格式」可以得出幾個結果,但沒有一個超級詳細。有node.js擴展名:https://www.npmjs.com/package/heapsnapshot-parser,以及v8源代碼包含最新的信息:https://github.com/v8/v8/blob/ master/include/v8-profiler.h – smirnoff

+0

謝謝,我在發帖後意識到源代碼是一個選項。我是新來的項目,欣賞鏈接。 – Schneems

回答

-1

優秀的問題! 依次爲:

  1. 對鉻堆轉儲存在結構待辦事項文檔?

是的!該谷歌文檔離散事件How to Record Heap Snapshots描述了堆轉儲的內容:

  • 構造代表所有對象使用此構造函數創建。
  • 對象實例數量顯示在#列中。
  • 淺尺寸列顯示所有對象的淺尺寸的總和 - 由某個構造函數創建。淺層大小 是由對象本身持有的內存大小(通常,數組和 字符串具有較大的淺層大小)。另見Object sizes
  • 保留大小列顯示同一組對象中的最大保留大小。一旦刪除 對象就可以釋放的內存大小(並且此依賴關係不再可達) 稱爲保留大小。另見Object sizes
  • 距離使用最短的簡單路徑節點顯示到根的距離。

這裏是Chrome瀏覽器開發工具堆這個非常頁面的轉儲,他們以表格的形式顯示:

Sample Chrome Dev tools Heap Dump

你會注意到架構大致符合結構上面引述的文件:

  • 距離
  • 對象計數
  • 淺大小
  • 留存面積

接下來,你問:

  • 有沒有一個標準的javascript堆轉儲格式或每個發動機 有自己的專有標準?
  • 不,沒有標準的堆轉儲格式截至2016年9月。每個引擎都有自己的格式,因爲每個引擎的堆轉儲格式都反映了堆結構,這取決於其內存管理方案,正如您可能會猜到的那樣。但是,請注意,在標準化nodejs轉儲的過程中發生了積極的討論 - open issue on Github

    1. 隱含的問題:爲什麼很難將JS引擎堆轉儲解析爲一個漂亮整潔的DB架構?

    因爲它的生命!!! I.e. DOM是流體!這是一個樹狀結構,隨時都可以大幅改變!堆轉儲內容的任何波動僅僅反映了這一點,這就是爲什麼Chrome開發工具中的分析和分析工具非常棒 - 並且非常有用!