1. java8函数式编程小引言
java8 增加了函数编程,函数可以作为参数传递,方便之处很多人已经说过了。确实也增加了java的功能,使代码更简洁,可读性增强。不过,函数式的编程相关的问题就来啦,本文从内存的泄露问题出发,提出java8中的小问题。
2. 问题代码
class Test {
public static void main(String[] args) {
Runnable runnable = new EnterpriseBean()
.runnable();
runnable.run(); // 断点
}
}
class EnterpriseBean {
Object[] enterpriseStateObject =
new Object[100_000_000];
Runnable runnable() {
return () -> {
// Some harmless debugging here
System.out.println("Hello from: " + this);
};
}
}
关键点在于 system.out.println(“Hello from:” + this) 中的this的引用。在断点处,查看变量runnable时,会发现还有一个EnterpriseBean的实例。返回的函数体内虽然只有一个输出,由于带有this,返回的匿名函数中也就包含了一个EnterpriseBean的实例。这个EnterpriseBean的实例不会被垃圾回收,直到调用释放Runnal后才释放。
3. 引用
以上发现均来自http://www.importnew.com/17292.html,感谢作者并致敬