【发布时间】:2015-10-21 03:55:29
【问题描述】:
我有一些 javascript 代码,如下所示:
var myClass = {
ids: {}
myFunc: function(huge_string) {
var id = huge_string.substr(0,2);
ids[id] = true;
}
}
稍后,该函数被一些大字符串 (100 MB+) 调用。我只想保存在每个字符串中找到的短 id。然而,谷歌浏览器的子字符串函数(实际上是我的代码中的正则表达式)只返回一个“切片字符串”对象,它引用了原始对象。因此,在对myFunc 进行了一系列调用后,我的 chrome 选项卡内存不足,因为临时的 huge_string 对象无法被垃圾回收。
如何复制字符串id,以便不维护对huge_string 的引用,并且可以对huge_string 进行垃圾回收?
【问题讨论】:
-
“子字符串函数(实际上是我代码中的正则表达式)只返回一个“切片字符串”对象,它引用了原始对象” - 嗯?
.substr()、.substring()、.slice()和相关的正则表达式函数都返回一个 new 字符串。调用myClass.myFunc()的其他代码是否保留了对您的巨大字符串的引用?如果您的真实代码更复杂,是否会不小心将巨大的字符串保留在闭包中? -
@nnnnnn 无法判断它是否是来自 JavaScript 的“新”字符串 data;实现可以共享底层数据而不违反 ECMAScript 的任何部分。 Firefox 有六个different string implementations(特别是参见 JSDependentString),如果 Chrome 有类似的优化(在某些边缘情况下可能表现不佳),我并不感到惊讶。话虽这么说..如果这是一条红鲱鱼,我不会感到非常惊讶。
-
这个bug report #2869 包含一个工作:
(' ' + src).slice(1)。没有正式的决议。 -
我在将脚本转换为“use strict;”时遇到了这个问题我们正在写入一个现在只读的字符串文字并获得“无法分配给字符串的只读属性'0'”。
标签: javascript google-chrome memory-management garbage-collection