我试图了解Google Chrome工具生成的heapdump的内容。我知道已经有一个浏览器内堆转储检查器,但我有兴趣编写一个解析JS堆转储作为练习的CLI。我无法找到堆转储内容结构的任何文档。它们具有人类可读性,但检查文件时格式不是很清楚
这是一个随机摘录:
"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:'richard@example.com',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",
是否存在有关chrome堆转储结构的文档?是否有标准的javascript堆转储格式或每个引擎都有自己的专有标准?
答案 0 :(得分:0)
优秀的问题! 反过来:
是的! Google Devs doc How to Record Heap Snapshots 描述了堆转储的内容:
- 构造函数表示使用此构造函数创建的所有对象。
- 对象实例数显示在#列中。
- 浅尺寸列显示所有对象的浅尺寸总和 - 由某个构造函数创建。浅的尺寸 是对象本身所拥有的内存大小(通常是数组和 字符串有较大的浅尺寸)。另见Object sizes。
- 保留大小列显示同一组对象中的最大保留大小。可以释放一次的内存大小 删除对象(并且其依赖项不再可访问) 被称为保留大小。另见Object sizes。
- 距离使用最短的节点简单路径显示到根的距离。
这是这个页面的Chrome Dev Tools的堆转储,它们以表格形式显示:
您会注意到架构松散地遵循上述文档的结构:
接下来,您询问:
不,截至2016年9月,没有标准的堆转储格式 。每个引擎都有自己的格式,因为每个引擎的堆转储格式都反映了它的堆结构,这取决于它的内存管理方案,正如您可能猜到的那样。但是,请注意,在标准化nodejs的转储的上下文中,存在对此影响的积极讨论 - open issue on Github。
因为 IT'S ALIVE !!! I.e. DOM是流动的!它是一种树状结构,随时都可以彻底改变!堆转储内容的任何波动都只反映了这一点,这就是为什么Chrome开发工具中的分析和分析实用程序如此惊人 - 并且非常有用!
答案 1 :(得分:0)
不幸的是,没有标准的JS堆格式之类的东西。快速搜索“ v8堆转储格式”会得到几个结果,但没有一个是超级详细的。有node.js heapsnapshot parser extension,而v8源代码包含最新信息:v8-profiler.h