Jas*_* T. 5 javascript string v8
有没有人对使用Chrome(V8)的Javascript中如何确定字符串的堆大小有很好的理解/解释?
我在堆转储中看到的一些示例:
1)具有不同@对象ID 的相同2个字符串(即"dt")的多个副本全部被指定为OneByteStrings.heapdump表示每个副本都有一个浅的&保留大小为32个字节.目前尚不清楚两个字节的字符串如何保留大小为32以及为什么字符串似乎没有被实现.
2)长对象路径字符串,长度为78个字符.所有字符都是utf8中的单个字节.它被归类为InternalizedString.它有一个184字节的保留大小.即使使用2字节字符编码仍然不能解释剩余的28个字节.为什么这些路径字符串占用了这么多空间?我可以想象另外4个字节(可能是8个)用于地址,另外4个用于存储字符串长度,但即使使用2个字节的字符编码,仍然会留下16个字节.
在内部,V8对字符串有许多不同的表示:
"Internalized"只是一个标志,实际的字符串表示可以是上述任何一种.
所有这些都有一个公共父类String,其父级是Name,其父级是HeapObject(它是V8堆上分配的对象的V8类层次结构的根).
在32位系统上,每个都是4个字节.在64位系统上,每个系统都是8个字节.
如果您使用的是64位系统,那么SeqOneByteString的最小大小将为32字节:上述头字段为24字节,字符串数据至少为一个字节,向上舍入为8的倍数.
关于你的第二个问题,很难确切地说出发生了什么.可能是字符串使用的是2字节表示,并且其标题字段的大小超出了您的预期,或者可能是ConsString或SlicedString(其保留的大小将包含它指向的字符串)至).
V8在大多数情况下不会内化字符串 - 它内化了在解析过程中找到的字符串常量和标识符名称,以及用作对象属性键的字符串,以及可能还有一些其他情况.