我分析了我的nodejs应用程序,看到了一些奇怪的字符串,在(切片字符串)中将其标记为 parent。
我使用v8-profiler和node-inspector。
这是探查器屏幕的照片(很抱歉,没有照片截图,只是我的系统确实重载并且没有足够的空间来显示屏幕):http://i.imgur.com/dkkPbGA.jpg
那么,我的问题是,(切片字符串)字符串中的这个父对象是什么?
UPD :经过一些审查后,据我了解,当我对字符串进行切片时,它存储了父字符串(是优化的吗?)。结果,这个 parent 的弦被内存了。在我复制了这个拼接后的字符串之后,看起来那里的父字符串已经从内存中清除了。我对吗?
最佳答案
是的,这是一种优化。当您有一个很长的字符串var longstring = "abc..."
,并从它创建一个子字符串(也称为“切片”)var short = longstring.substr(20, 30)
时,实际上并不会在内存中复制字符;相反,short
在内部仅表示为a slice of |longstring| beginning at index 20 with a length of 30
,而longstring
称为short
的“父级”。只要您的代码保留对short
的引用,垃圾回收器就无法释放longstring
。
(根据记录,我们(V8开发人员)知道此优化可能会对内存消耗产生负面影响,因为当仅复制仍需要的部分将使用较少的内存时,它可能导致长字符串保持事件状态。问题是在一般情况下,计算该操作是否有意义(因为只需要一个短块)或不合理(因为有很多重叠的切片,相加后,它们比共享的父对象占用更多的内存),这是相当昂贵的会使垃圾收集器变慢很多。)