我分析了我的nodejs应用程序并看到了一些奇怪的字符串,它在(切片字符串)中标记为父级。
我使用V8-分析器和节点检查器。
下面是分析器屏幕的照片(很抱歉是照片,不是截图,只是我的系统真的超载了,没有足够的空间来制作屏幕):http://i.imgur.com/dkkPbGA.jpg
那么,我的问题是,(切片的字符串)字符串中的这个父字符串是什么?
UPD:经过一些回顾之后,我似乎理解了,当我对字符串进行切片时,它是存储的父字符串(它是优化的吗?)结果,这个父字符串在记忆中。在我复制这个拼接字符串之后,看起来这个父字符串在内存中被清除了。我说的对吗?
发布于 2017-03-18 05:32:01
是的,这是一个优化。当您有一个长字符串var longstring = "abc..."
时,您将创建一个子字符串(a.k.a )。(“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开发人员)知道,这种优化会对内存消耗产生负面影响,因为当只复制仍然需要的部分时,会导致长字符串保持活动状态,从而减少内存的使用。问题是,在一般情况下,计算该操作是否有意义(因为仍然需要一个很小的块)(因为有许多重叠的片,加起来会比共享的父块占用更多的内存),这是相当昂贵的,并且会使垃圾收集器速度更慢。
https://stackoverflow.com/questions/32813720
复制相似问题