「說明」
本文介紹 Java 內部類持有外部類導致內存泄露的原因以及其解決方案。
「為什么內部類持有外部類會導致內存泄露?」
非靜態內部類會持有外部類,如果有地方引用了這個非靜態內部類,會導致外部類也被引用,垃圾回收時無法回收這個外部類(即使外部類已經沒有其他地方在使用了)。
「解決方案」
不要讓其他的地方持有這個非靜態內部類的引用,直接在這個非靜態內部類執行業務。
將非靜態內部類改為靜態內部類。內部類改為靜態的之后,它所引用的對象或屬性也必須是靜態的,所以靜態內部類無法獲得外部對象的引用,只能從 JVM 的 Method Area(方法區)獲取到static類型的引用。
為什么要持有外部類
Java 語言中,非靜態內部類的主要作用有兩個:
當內部類只在外部類中使用時,匿名內部類可以讓外部不知道它的存在,從而減少了代碼的維護工作。
當內部類持有外部類時,它就可以直接使用外部類中的變量了,這樣可以很方便的完成調用,如下代碼所示:
但是,靜態內部類就無法持有外部類和其非靜態字段了。
比如下邊這樣就會報錯
![wKgaomRl3ciAfKSLAAC-XcDhaJ0306.jpg](https://file1.elecfans.com/web2/M00/83/98/wKgaomRl3ciAfKSLAAC-XcDhaJ0306.jpg)
報錯:
![cc479778-e34f-11ed-ab56-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9B/35/wKgaomTno3yAPaG_AADLojhpf78892.png)
實例:持有外部類
「代碼」
![wKgZomRl3eaAC3aAAACaTa8NwN4139.jpg](https://file1.elecfans.com/web2/M00/83/98/wKgZomRl3eaAC3aAAACaTa8NwN4139.jpg)
「斷點調試」
可以看到:內部類持有外部類的對象的引用,是以“this$0”這個字段來保存的。
![cc670e96-e34f-11ed-ab56-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9B/35/wKgaomTno3yAWSEAAADipaaMkds507.png)
實例:不持有外部類
「代碼」
「斷點調試」
可以發現:內部類不再持有外部類了。
實例:內存泄露
「簡介」
若內部類持有外部類的引用,對內部類的使用很多時,會導致外部類數目很多。此時,就算是外部類的數據沒有被用到,外部類的數據所占空間也不會被釋放。 本處在外部類存放大量的數據來模擬。
「代碼」
「測試」
可以看到:運行了八千多次的時候就內存溢出了。
我換了一臺 mac 電腦,4000 多就內存溢出了。
不會內存泄露的方案
「簡介」
內部類改為靜態的之后,它所引用的對象或屬性也必須是靜態的,所以靜態內部類無法獲得外部對象的引用,只能從 JVM 的 Method Area(方法區)獲取到 static 類型的引用。
「代碼」
「測試」
可以發現:循環了四十多萬次都沒有內存溢出。
審核編輯:劉清
-
JAVA語言
+關注
關注
0文章
138瀏覽量
20178 -
JVM
+關注
關注
0文章
158瀏覽量
12260
原文標題:Java 內部類有坑。。100 % 內存泄露!
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
Executors使用不當引起的內存泄漏怎么解決
接口、內部類和Java API基礎
java內部類分析詳解
java內部類怎么寫
![<b class='flag-5'>java</b><b class='flag-5'>內部類</b>怎么寫](https://file.elecfans.com/web2/M00/49/E1/pYYBAGKhvG-AULSWAAA0_IiBCBU808.png)
java開發中遇到的難點有哪些_java開發常見的問題及解決辦法
潤滑油和潤滑脂使用不當的幾種表現
java內部類可以用public修飾嗎
java內存溢出的幾種原因和解決辦法
M16連接器8芯使用不當會出現什么情況
![M16連接器8芯<b class='flag-5'>使用不當</b>會出現什么情況](https://file1.elecfans.com/web2/M00/C6/54/wKgaomX9JraAfrffAADMjZr3SK0688.png)
MCX射頻頭使用不當會出現什么情況
![MCX射頻頭<b class='flag-5'>使用不當</b>會出現什么情況](https://file1.elecfans.com/web2/M00/09/1A/wKgaomb2BLOAQABkAADMIykWClc762.png)
評論