Node.js分析:父级(切片字符串)

use*_*305 5 v8 node.js

我分析了nodejs应用程序,看到了一些奇怪的字符串,在(切片字符串)中将其标记为父级

我使用v8-profiler和node-inspector。

这是探查器屏幕的照片(很抱歉,没有照片截图,只是我的系统确实超载并且没有足够的空间来显示屏幕):http : //i.imgur.com/dkkPbGA.jpg

那么,我的问题是,(切片字符串)字符串中的该父对象是什么?

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

jmr*_*mrk 3

是的,这是一个优化。当你有一个很长的字符串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的“父级”。只要您的代码保留对 的引用shortlongstring垃圾收集器就无法释放它。

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