在动态创建映射时防止Java Nashorn过度使用内存

时间:2016-10-14 01:35:20

标签: javascript java garbage-collection nashorn

这个简单的代码,当与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"作为弱引用,依此类推。

这使得代码在内存和时间上都是二次方的。

任何想法如何避免它?

2 个答案:

答案 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());