精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Java內部類使用不當導致的內存泄露問題及解決辦法

Android編程精選 ? 來源:CSDN ? 2023-05-18 16:09 ? 次閱讀

「說明」

本文介紹 Java 內部類持有外部類導致內存泄露的原因以及其解決方案。

「為什么內部類持有外部類會導致內存泄露?」

非靜態內部類會持有外部類,如果有地方引用了這個非靜態內部類,會導致外部類也被引用,垃圾回收時無法回收這個外部類(即使外部類已經沒有其他地方在使用了)。

「解決方案」

不要讓其他的地方持有這個非靜態內部類的引用,直接在這個非靜態內部類執行業務。

將非靜態內部類改為靜態內部類。內部類改為靜態的之后,它所引用的對象或屬性也必須是靜態的,所以靜態內部類無法獲得外部對象的引用,只能從 JVM 的 Method Area(方法區)獲取到static類型的引用。

為什么要持有外部類

Java 語言中,非靜態內部類的主要作用有兩個:

當內部類只在外部類中使用時,匿名內部類可以讓外部不知道它的存在,從而減少了代碼的維護工作。

當內部類持有外部類時,它就可以直接使用外部類中的變量了,這樣可以很方便的完成調用,如下代碼所示:

wKgaomRl3aOAfJj5AAC326t5afA876.jpg

但是,靜態內部類就無法持有外部類和其非靜態字段了。

比如下邊這樣就會報錯


wKgaomRl3ciAfKSLAAC-XcDhaJ0306.jpg

報錯:

cc479778-e34f-11ed-ab56-dac502259ad0.png

實例:持有外部類

「代碼」


wKgZomRl3eaAC3aAAACaTa8NwN4139.jpg

「斷點調試」

可以看到:內部類持有外部類的對象的引用,是以“this$0”這個字段來保存的。

cc670e96-e34f-11ed-ab56-dac502259ad0.png

實例:不持有外部類

「代碼」

wKgaomRl3hCAKVebAACe3joRVoY043.jpg


「斷點調試」

可以發現:內部類不再持有外部類了。

cc8643b0-e34f-11ed-ab56-dac502259ad0.png

實例:內存泄露

「簡介」

若內部類持有外部類的引用,對內部類的使用很多時,會導致外部類數目很多。此時,就算是外部類的數據沒有被用到,外部類的數據所占空間也不會被釋放。 本處在外部類存放大量的數據來模擬

「代碼」

wKgZomRl3kyAbciLAACKCIJNulY405.jpg
wKgaomRl3lSAMNvsAABxKltqJGg649.jpg

「測試」

可以看到:運行了八千多次的時候就內存溢出了。

cca0d23e-e34f-11ed-ab56-dac502259ad0.png

我換了一臺 mac 電腦,4000 多就內存溢出了。

ccc30232-e34f-11ed-ab56-dac502259ad0.png

不會內存泄露的方案

「簡介」

內部類改為靜態的之后,它所引用的對象或屬性也必須是靜態的,所以靜態內部類無法獲得外部對象的引用,只能從 JVM 的 Method Area(方法區)獲取到 static 類型的引用。

「代碼」

wKgZomRl3ouAEs_OAACRRLHwKvQ661.jpg
wKgZomRl3pKAFOqTAABqpeuEStM022.jpg

「測試」

可以發現:循環了四十多萬次都沒有內存溢出。

cce69c60-e34f-11ed-ab56-dac502259ad0.png





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA語言
    +關注

    關注

    0

    文章

    138

    瀏覽量

    20025
  • JVM
    JVM
    +關注

    關注

    0

    文章

    155

    瀏覽量

    12168

原文標題:Java 內部類有坑。。100 % 內存泄露!

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Executors使用不當引起的內存泄漏怎么解決

    (TaskThread.java:61)  at java.lang.Thread.run(Thread.java:748)  看到了如上信息之后,大概可以看出是由于線程池的使用不當
    發表于 12-23 17:38

    如何解決STM32串口溢出錯誤Overrun使用不當導致的串口死機?

    如何解決STM32串口溢出錯誤Overrun使用不當導致的串口死機?
    發表于 12-15 07:29

    3G手機使用不當 近視加深百度

    3G手機使用不當 近視加深百度  (中國電子商務研究中心訊)新事物總是受歡迎,眼下,隨時隨地能上網的3G手機讓許多市民尤其是年輕
    發表于 02-01 09:05 ?624次閱讀

    MP3使用不當會造成的健康問題

    MP3使用不當會造成的健康問題 別看MP3這個小數碼產品,如果不正確使用說不定會損害你的身體健康。
    發表于 02-01 17:20 ?439次閱讀

    熱水器使用不當易漏電傷人

    熱水器使用不當易漏電傷人     重慶市消委近日發出消費警示,提醒消費者應謹慎購買使用電熱水器,以防發生漏電傷人事故。 &nb
    發表于 02-21 16:47 ?973次閱讀

    物理內存使用率高的原因及解決辦法

    主要講解的就是物理內存使用率高的原因以及他的解決辦法導致物理內存使用率高有幾種可能,而最常見的則有兩種:一是安裝不好的程序,內存被占用太多
    發表于 05-03 17:14 ?9281次閱讀
    物理<b class='flag-5'>內存</b>使用率高的原因及<b class='flag-5'>解決辦法</b>

    接口、內部類Java API基礎

    理解接口的作用,理解接口和實現接口的類的關系,掌握聲明接口、一個類實現多個接口的聲明和使用方法。理解內嵌類型的概念,掌握聲明內部類的方法。熟悉Java語言包和實用包中的常用類。
    發表于 11-23 11:52 ?0次下載

    java內部類分析詳解

    可以將一個類的定義放在另一個類的定義內部,這就是內部類內部類是一個非常有用的特性但又比較難理解使用的特性(鄙人到現在都沒有怎么使用過內部類,對
    發表于 09-27 14:59 ?0次下載

    java內部類怎么寫

    一。內部類基礎 二。深入理解內部類 三。內部類的使用場景和好處 四。常見的與內部類相關的筆試面試題 若有不正之處,請多諒解并歡迎批評指正。 一。內部
    發表于 09-27 16:15 ?0次下載
    <b class='flag-5'>java</b><b class='flag-5'>內部類</b>怎么寫

    java開發中遇到的難點有哪些_java開發常見的問題及解決辦法

    本文主要介紹的是java開發,首先介紹了java開發的過程,其次介紹了java開發中遇到的難點,最后闡述了java開發常見的問題及解決辦法
    發表于 04-26 16:49 ?9.3w次閱讀

    潤滑油和潤滑脂使用不當的幾種表現

    潤滑油和潤滑脂使用不當的幾種表現 潤滑油(俗稱機油)和潤滑脂(俗稱黃油),在農機維修保養中被廣泛應用。正確使用潤滑油和潤滑脂關系到機械使用壽命的長短。最近,筆者在南昌市郊農村調研中發現有些農機
    的頭像 發表于 06-28 18:54 ?1162次閱讀

    Java內部類持有外部類導致內存泄露的原因以及其解決方案

    簡介 為什么要持有外部類 實例:持有外部類 實例:不持有外部類 實例:內存泄露 不會內存
    的頭像 發表于 10-08 16:32 ?899次閱讀

    java內部類可以用public修飾嗎

    Java內部類是指一個類被定義在另一個類的內部。根據定義的位置和訪問權限的不同,內部類可以分為四種:成員內部類、靜態
    的頭像 發表于 11-21 10:23 ?847次閱讀

    java內存溢出的幾種原因和解決辦法

    內存,但是如果程序中存在內存泄漏(Memory Leak)或者使用不當的數據結構等問題,仍然有可能導致內存溢出。下面將詳細介紹
    的頭像 發表于 11-23 14:44 ?5180次閱讀

    M16連接器8芯使用不當會出現什么情況

      德索工程師說道M16連接器8芯,作為一種高性能的電氣連接器件,其正確使用對于整個系統的穩定性和安全性至關重要。然而,如果使用不當,可能會引發一系列問題,從而影響系統的正常運行。以下是關于M16連接器8芯使用不當可能出現的情況的詳細分析:
    的頭像 發表于 06-06 17:39 ?349次閱讀
    M16連接器8芯<b class='flag-5'>使用不當</b>會出現什么情況