防止Java Nashorn在动态创建映射时过度使用内存
Preventing Java Nashorn from super excessive memory usage when dynamically creating a map
这段琐碎的代码,在使用Nashorn运行时,会导致完整的gc
var x = {};
for (var i = 0; i < 10000; i++) {
var key = "key-" + i;
x[key] = i;
}
通读Nashorn的实现,我相信每次添加一个对象(使用PropertyMap类)都会克隆一个对象,添加新键,将其作为弱引用链接到上一个版本的"历史",等等。
这使得上面的代码在内存和时间上都是二次的。
有什么办法可以避免吗?
你的分析是正确的,Nashorn对象和属性映射目前不能缩放到很多属性。使PropertyMap不可变的原因是允许通过比较PropertyMap引用来快速验证内联调用站点。
一种解决方案是,当属性的数量超过某个阈值时,切换到per-ScriptObject,可变属性映射。我们可能会在Nashorn的未来版本中实现这个功能,但我现在不能做出任何承诺。
作为一种解决方法,您可以使用Java Maps来存储大量的键值对。此外,在JDK 9中,Nashorn将获得一些ECMAScript 6的特性,包括新的Map, Set, WeakMap和WeakSet集合。
你试过使用原型吗?我不确定(没有与Nashorn工作),但也许这可以帮助你:
var x = function() {};
for (var i = 0; i < 10000; i++) {
var key = "key-" + i;
x.prototype[key] = i;
}
console.log(new x());
相关文章:
- 如何在映射数组中添加换行符
- ng映射方向备选方案
- 无法通过数组映射绑定
- ReactJS映射:如何仅在url变量不为空时呈现html链接
- 使用Scala Play Framework视图中的键检索映射值
- 淘汰映射;不起作用
- 映射数组ES6时考虑空值
- Lodash映射并返回唯一
- 重复应用 d3 转换导致的内存泄漏
- 如何对映射插件创建的敲除对象进行深度复制
- 如何显示在给定极限内存在的所有素数
- IE7中的blockUI插件内存泄漏25kb
- 在javascript中按映射中的值排序
- Javascript闭包-如何防止内存泄漏
- 使用带有两个参数的函数的javascript映射
- 在内部映射值时渲染方法中断
- JSON:获取映射数据
- HTML Dropdownlist未映射到MVC模型
- 我可以有一个javascript对象从内存中删除自己设置它的映射值为空
- 防止Java Nashorn在动态创建映射时过度使用内存