这个简单的代码,当与Nashorn一起运行时,会导致完整的GC
$('#myModal').on('show.bs.modal', function(e) {
window.location.hash = "modal";
});
$(window).on('hashchange', function (event) {
if(window.location.hash != "#modal") {
$('#myModal').modal('hide');
}
});
通过Nashorn实现,我相信每个对Object的添加(使用PropertyMap类)都会克隆一个对象,添加新密钥,将其链接到以前的版本" s" history"作为弱引用,依此类推。
这使得代码在内存和时间上都是二次方的。
任何想法如何避免它?
答案 0 :(得分:2)
您的分析是正确的,Nashorn对象和属性映射当前不会扩展到许多属性。使PropertyMap不可变的原因是允许通过比较PropertyMap引用来快速验证内联调用。
一种解决方案是在属性数量超过某个阈值时切换到每个ScriptObject,可变属性映射。我们可能会在Nashorn的未来版本中实现这一点,但我现在无法做出任何承诺。
作为一种解决方法,您可以使用Java Maps存储大量的键值对。此外,在JDK 9中,Nashorn将获得一些ECMAScript 6功能,其中包括新的Map,Set,WeakMap和WeakSet集合。
答案 1 :(得分:0)
您是否尝试过使用原型? 我不确定(不与Nashorn合作),但也许这可以帮到你:
var x = function() {};
for (var i = 0; i < 10000; i++) {
var key = "key-" + i;
x.prototype[key] = i;
}
console.log(new x());