1. 程式人生 > >java內部類實現(可能導致記憶體洩漏)

java內部類實現(可能導致記憶體洩漏)

在使用java內部類的時候要注意可能引起的記憶體洩漏 程式碼如下

package com.example;

public class MyClass {


    public static void main(String[] args) throws Throwable {

    }

    public class A{
        public void methed1(){

        }
    }

    public static  class B{
        public void methed1(){

        }
    }

編譯生成了如下檔案

這裡寫圖片描述

反編譯MyClass

這裡寫圖片描述

反編譯MyClass$A

這裡寫圖片描述

反編譯MyClass$B

這裡寫圖片描述

從反編譯的結果可以知道,內部類的實現其實是通過編譯器的語法糖實現的,通過生成相應的子類即以OutClassName$InteriorClassName命名的Class檔案。並新增建構函式,在建構函式中傳入外部類,這也是為什麼內部類能使用外部類的方法與欄位的原因。我們明白了這個也就要小心,當外部類與內部類生命週期不一致的時候很有可能發生記憶體洩漏,例如在一個Activity啟動一個Thread執行一個任務,因為Thread是內部類持有了Activity的引用,當Activity銷燬的時候如果Thread的任務沒有執行完成,造成Activity的引用不能釋放,Activity不能被釋放而引起了記憶體洩漏。這種情況下可以通過宣告一個static的內部類來解決問題,從反編譯中可以看出,宣告為static的類不會持有外部類的引用,如果你想使用外部類的話,可以通過軟引用的方式儲存外部類的引用。具體的程式碼就不上了。

--------------------- 本文來自 -SOLO- 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/qq_22706515/article/details/51321718?utm_source=copy