我分析了我的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开发人员)知道此优化可能会对内存消耗产生负面影响,因为当仅复制仍需要的部分将使用较少的内存时,它可能导致长字符串保持事件状态。问题是在一般情况下,计算该操作是否有意义(因为只需要一个短块)或不合理(因为有很多重叠的切片,相加后,它们比共享的父对象占用更多的内存),这是相当昂贵的会使垃圾收集器变慢很多。)

10-02 17:11