Java8的一个小缺点

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,感谢作者并致敬

你可能感兴趣的:(个人,javaweb)