我试图在我在Nashorn中运行的JavaScript程序中使用弱引用。看起来这应该是可能的,因为我可以实例化一个Java WeakReference对象,将JavaScript对象传递给它。但似乎这不起作用。
// weaknash.js
var WeakRef = Java.type("java.lang.ref.WeakReference");
var obj = {p: "abc"};
var wr = new WeakRef(obj);
print(obj); // should print object
print(wr.get()); // should print object
Packages.java.lang.System.gc();
print(obj); // should print object
print(wr.get()); // should print object
obj = null;
Packages.java.lang.System.gc();
print(obj); // should print null
print(wr.get()); // should print null
当我运行它时,我得到以下输出:
$ jjs weaknash.js
[object Object]
[object Object]
[object Object]
null
null
null
我希望输出如下:
$ jjs weaknash.js
[object Object]
[object Object]
[object Object]
[object Object]
null
null
问题是即使仍有obj
仍包含对象的引用,但wr
引用的对象由垃圾收集器收集。尽管如此,对象obj
仍然可用。
如何让WeakReference
正确跟踪Nashorn中的JavaScript对象?