Java8的一個小缺點

孫悟空空發表於2017-07-25

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,感謝作者並致敬

相關文章