我分析了我的 Nodejs 应用程序并看到一些奇怪的字符串,它被标记为父级(切片字符串).
我使用 v8-profiler 和 node-inspector。
这是分析器屏幕的照片(抱歉是照片,不是屏幕截图,只是我的系统真的超载并且没有足够的空间来制作屏幕):https://i.stack.imgur.com/7OxSf.jpg https://i.stack.imgur.com/7OxSf.jpg
所以,我的问题是,这是什么父级(切片字符串)字符串?
UPD:经过一番审查后,我明白了,当我在字符串上进行切片时,它存储了父字符串(这是优化吗?)。结果父母的这根弦就留在了记忆里。在我复制这个拼接字符串后,看起来这个父字符串已从内存中清除。我对吗?
是的,这是一个优化。当你有一根长绳子时var longstring = "abc..."
,然后从中创建一个子字符串(也称为“切片”)var short = longstring.substr(20, 30)
,那么这些字符实际上并没有在内存中复制;反而short
内部仅表示为a slice of |longstring| beginning at index 20 with a length of 30
, and longstring
叫做short
的“父母”。只要您的代码保留对short
, longstring
无法被垃圾收集器释放。
(根据记录,我们(V8 开发人员)知道这种优化可能会对内存消耗产生负面影响,因为当仅复制仍然需要的部分时,它可能会导致长字符串保持活动状态,从而使用更少的内存。问题是在一般情况下,计算该操作是否有意义(因为仍然需要一小块)或无意义(因为有许多重叠的切片,当它们加起来时,将比它们的共享父代占用更多的内存)是相当昂贵的并且会使垃圾收集器变慢一些。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)