我描述了我的nodejs应用程序并查看了一些奇怪的字符串,它在(切片字符串)中标记为 parent 。
我使用的是v8-profiler和node-inspector。
这是探查器屏幕的照片(抱歉照片,不是截图,只是我的系统真的超载,没有足够的空间来制作屏幕):http://i.imgur.com/dkkPbGA.jpg
所以,我的问题是,(切片字符串)字符串中的父级是什么?
UPD :经过一些审核看起来我明白了,当我对字符串进行切片时,它存储了父字符串(是优化吗?)。结果这个父母的字符串在记忆中。复制这个拼接的字符串后,看起来这个父字符串已从内存中清除。我是对的吗?
答案 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开发人员)知道这种优化可能会对内存消耗产生负面影响,因为只要复制出仍然需要的部分会占用更少的内存,它就会导致长字符串保持活动状态。问题是,在一般情况下,计算该操作是否有意义(因为仍然只需要一个短块)(因为有许多重叠切片,当它们相加时,会占用比共享父项更多的内存),是相当昂贵的,会使垃圾收集器慢一点。)