hello2dj / blog

一些总结文章
27 stars 1 forks source link

v8-snapshot解析(heapdump的文件) #32

Open hello2dj opened 5 years ago

hello2dj commented 5 years ago

snapshot(v8)

default
从上图我们可以清晰节点的类型一共有13种,hidden类型可能不展示
default
从上图可以看出共有7种
* map, array, symbol, object, regexp, number, boolean, string, date,typedarray...这些常见的内建对象我就不解释了,大家都知道
* 我们在sanpshot中还会经常看见两类string比较生疏的两个(这两类算在pimitive中), sliced string和 concatenated string
  * 那我们就来看看string,在v8里的形式
default
    在这里我们可以清晰的看出来,v8的字符串类型,里面有sliced的解释,是其他字符串的部分引用(因为字面量字符串是不可变的so可以这么办。。),而cons的就是(a, b),或者嵌套似的((a,b),c)这样的pairs(同样是因为字面量的字符串是不可变的)

chrome devtools 里的概念

default
  我错了
  * (string, regexp) 显示的是literal string 即 a='234'中的'23', regexp类似
  * (num) 显示的是以number对象展示的对象
  * (array) 那些通过数组引用的对象,说白了就是数组对象
    * (code deopt data)[]: v8去优化时的数据
    * []:就是纯数组
    * (object properties)[]:通过对象属性引用的对象
    * (map descriptors)[]: map类型相关,暂时搁置
    * (object elements)[]: 暂时未知
    * (function scope info)[]: 暂时未知
  * (system) 那就是原生代码了
  * (compiled code) 编译过后的代码
  * (closure) 通过闭包引用的对象,但感觉更像是闭包自己
  * (sliced string): 搁置
  * (undefined): 搁置
  * (concatenated string): 搁置

看一次对其中两个对象的识别及分析

代码如下,num2是一个Number对象,不知道为啥,我以字面量分配的num1,我没找到。。。(有待继续)

num2 = new Number(234);

接下来的图示顺序分析的

![28081](https://user-images.githubusercontent.com/10645383/49697950-7f3d8700-fbf8-11e8-8ad1-2401881c101f.png)
![28081](https://user-images.githubusercontent.com/10645383/49697953-882e5880-fbf8-11e8-9e84-8e0f4ce60b4f.png)

15319

常见的内存泄露种类

An object size

那么V8的GC root都有哪些呢

那么哪些动作会导致新的分配动作呢

使用devtools进行profiling的tips

three snapshot method (https://docs.google.com/presentation/d/1wUVmf78gG-ra5aOxvTfYdiLkdGaR9OhXRnOlIcEmu2s/pub?start=false&loop=false&delayms=3000&slide=id.g31ec7af_0_58)