Nodejs profiling:parent in(切片字符串)

时间:2015-09-27 22:59:39

标签: node.js v8

我描述了我的nodejs应用程序并查看了一些奇怪的字符串,它在(切片字符串)中标记为 parent

我使用的是v8-profiler和node-inspector。

这是探查器屏幕的照片(抱歉照片,不是截图,只是我的系统真的超载,没有足够的空间来制作屏幕):http://i.imgur.com/dkkPbGA.jpg

所以,我的问题是,(切片字符串)字符串中的父级是什么?

UPD :经过一些审核看起来我明白了,当我对字符串进行切片时,它存储了父字符串(是优化吗?)。结果这个父母的字符串在记忆中。复制这个拼接的字符串后,看起来这个父字符串已从内存中清除。我是对的吗?

1 个答案:

答案 0 :(得分:0)

是的,这是一个优化。如果你有一个长字符串var longstring = "abc...",并且从它var short = longstring.substr(20, 30)创建一个子字符串(a.k.a。“slice”),那么这些字符实际上并没有复制到内存中;相反,short在内部仅表示为a slice of |longstring| beginning at index 20 with a length of 30,而longstring则称为short的“父”。只要您的代码保留对short的引用,垃圾收集器就无法释放longstring

(为了记录,我们(V8开发人员)知道这种优化可能会对内存消耗产生负面影响,因为只要复制出仍然需要的部分会占用更少的内存,它就会导致长字符串保持活动状态。问题是,在一般情况下,计算该操作是否有意义(因为仍然只需要一个短块)(因为有许多重叠切片,当它们相加时,会占用比共享父项更多的内存),是相当昂贵的,会使垃圾收集器慢一点。)