色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java內(nèi)部類(lèi)持有外部類(lèi)導(dǎo)致內(nèi)存泄露的原因以及其解決方案

電子工程師 ? 來(lái)源: 芋道源碼 ? 作者: 芋道源碼 ? 2022-10-08 16:32 ? 次閱讀

簡(jiǎn)介

為什么要持有外部類(lèi)

實(shí)例:持有外部類(lèi)

實(shí)例:不持有外部類(lèi)

實(shí)例:內(nèi)存泄露

不會(huì)內(nèi)存泄露的方案

簡(jiǎn)介

「說(shuō)明」

本文介紹 Java 內(nèi)部類(lèi)持有外部類(lèi)導(dǎo)致內(nèi)存泄露的原因以及其解決方案。

「為什么內(nèi)部類(lèi)持有外部類(lèi)會(huì)導(dǎo)致內(nèi)存泄露?」

非靜態(tài)內(nèi)部類(lèi)會(huì)持有外部類(lèi),如果有地方引用了這個(gè)非靜態(tài)內(nèi)部類(lèi),會(huì)導(dǎo)致外部類(lèi)也被引用,垃圾回收時(shí)無(wú)法回收這個(gè)外部類(lèi)(即使外部類(lèi)已經(jīng)沒(méi)有其他地方在使用了)。

「解決方案」

不要讓其他的地方持有這個(gè)非靜態(tài)內(nèi)部類(lèi)的引用,直接在這個(gè)非靜態(tài)內(nèi)部類(lèi)執(zhí)行業(yè)務(wù)。

將非靜態(tài)內(nèi)部類(lèi)改為靜態(tài)內(nèi)部類(lèi)。內(nèi)部類(lèi)改為靜態(tài)的之后,它所引用的對(duì)象或?qū)傩砸脖仨毷庆o態(tài)的,所以靜態(tài)內(nèi)部類(lèi)無(wú)法獲得外部對(duì)象的引用,只能從 JVM 的 Method Area(方法區(qū))獲取到static類(lèi)型的引用。

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項(xiàng)目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

為什么要持有外部類(lèi)

Java 語(yǔ)言中,非靜態(tài)內(nèi)部類(lèi)的主要作用有兩個(gè):

當(dāng)內(nèi)部類(lèi)只在外部類(lèi)中使用時(shí),匿名內(nèi)部類(lèi)可以讓外部不知道它的存在,從而減少了代碼的維護(hù)工作。

當(dāng)內(nèi)部類(lèi)持有外部類(lèi)時(shí),它就可以直接使用外部類(lèi)中的變量了,這樣可以很方便的完成調(diào)用,如下代碼所示:

packageorg.example.a;

classOuter{
privateStringouterName="Tony";

classInner{
privateStringname;

publicInner(){
this.name=outerName;
}
}

InnercreateInner(){
returnnewInner();
}
}

publicclassDemo{
publicstaticvoidmain(String[]args){
Outer.Innerinner=newOuter().createInner();
System.out.println(inner);
}
}

但是,靜態(tài)內(nèi)部類(lèi)就無(wú)法持有外部類(lèi)和其非靜態(tài)字段了。比如下邊這樣就會(huì)報(bào)錯(cuò)

packageorg.example.a;

classOuter{
privateStringouterName="Tony";

staticclassInner{
privateStringname;

publicInner(){
this.name=outerName;
}
}

InnercreateInner(){
returnnewInner();
}
}

publicclassDemo{
publicstaticvoidmain(String[]args){
Outer.Innerinner=newOuter().createInner();
System.out.println(inner);
}
}

報(bào)錯(cuò):

9985cd7a-46ae-11ed-96c9-dac502259ad0.png

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項(xiàng)目地址:https://gitee.com/zhijiantianya/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

實(shí)例:持有外部類(lèi)

「代碼」

packageorg.example.a;

classOuter{
classInner{

}

InnercreateInner(){
returnnewInner();
}
}

publicclassDemo{
publicstaticvoidmain(String[]args){
Outer.Innerinner=newOuter().createInner();
System.out.println(inner);
}
}

「斷點(diǎn)調(diào)試」

可以看到:內(nèi)部類(lèi)持有外部類(lèi)的對(duì)象的引用,是以“this$0”這個(gè)字段來(lái)保存的。

99a23ec4-46ae-11ed-96c9-dac502259ad0.png

實(shí)例:不持有外部類(lèi)

「代碼」

packageorg.example.a;

classOuter{
staticclassInner{

}

InnercreateInner(){
returnnewInner();
}
}

publicclassDemo{
publicstaticvoidmain(String[]args){
Outer.Innerinner=newOuter().createInner();
System.out.println(inner);
}
}

「斷點(diǎn)調(diào)試」

可以發(fā)現(xiàn):內(nèi)部類(lèi)不再持有外部類(lèi)了。

99c4316e-46ae-11ed-96c9-dac502259ad0.png

實(shí)例:內(nèi)存泄露

「簡(jiǎn)介」

若內(nèi)部類(lèi)持有外部類(lèi)的引用,對(duì)內(nèi)部類(lèi)的使用很多時(shí),會(huì)導(dǎo)致外部類(lèi)數(shù)目很多。此時(shí),就算是外部類(lèi)的數(shù)據(jù)沒(méi)有被用到,外部類(lèi)的數(shù)據(jù)所占空間也不會(huì)被釋放。

本處在外部類(lèi)存放大量的數(shù)據(jù)來(lái)模擬

「代碼」

packageorg.example.a;

importjava.util.ArrayList;
importjava.util.List;

classOuter{
privateint[]data;

publicOuter(intsize){
this.data=newint[size];
}

classInnner{

}

InnnercreateInner(){
returnnewInnner();
}
}

publicclassDemo{
publicstaticvoidmain(String[]args){
Listlist=newArrayList<>();
intcounter=0;
while(true){
list.add(newOuter(100000).createInner());
System.out.println(counter++);
}
}
}

「測(cè)試」

可以看到:運(yùn)行了八千多次的時(shí)候就內(nèi)存溢出了。

99d10b96-46ae-11ed-96c9-dac502259ad0.png

換了一臺(tái) mac 電腦,4000 多就內(nèi)存溢出了。

99f6a4c8-46ae-11ed-96c9-dac502259ad0.png

不會(huì)內(nèi)存泄露的方案

「簡(jiǎn)介」

內(nèi)部類(lèi)改為靜態(tài)的之后,它所引用的對(duì)象或?qū)傩砸脖仨毷庆o態(tài)的,所以靜態(tài)內(nèi)部類(lèi)無(wú)法獲得外部對(duì)象的引用,只能從 JVM 的 Method Area(方法區(qū))獲取到 static 類(lèi)型的引用。

「代碼」

packageorg.example.a;

importjava.util.ArrayList;
importjava.util.List;

classOuter{
privateint[]data;

publicOuter(intsize){
this.data=newint[size];
}

staticclassInner{

}

InnercreateInner(){
returnnewInner();
}
}

publicclassDemo{
publicstaticvoidmain(String[]args){
Listlist=newArrayList<>();
intcounter=0;
while(true){
list.add(newOuter(100000).createInner());
System.out.println(counter++);
}
}
}

「測(cè)試」

可以發(fā)現(xiàn):循環(huán)了四十多萬(wàn)次都沒(méi)有內(nèi)存溢出。

9a1f2cfe-46ae-11ed-96c9-dac502259ad0.png

以上,希望能對(duì)大家在使用內(nèi)部類(lèi)時(shí)會(huì)有所幫助。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3052

    瀏覽量

    74214
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2974

    瀏覽量

    104968
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    158

    瀏覽量

    12252
  • static
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    10396

原文標(biāo)題:Java內(nèi)部類(lèi)有坑,100%內(nèi)存泄露!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Java知識(shí):內(nèi)部類(lèi)與匿名類(lèi)_內(nèi)部類(lèi)#Java

    JAVA
    學(xué)習(xí)電子
    發(fā)布于 :2022年11月16日 01:30:13

    Java基礎(chǔ)知識(shí):內(nèi)部類(lèi)和匿名內(nèi)部類(lèi)#Java

    JAVA
    學(xué)習(xí)硬聲知識(shí)
    發(fā)布于 :2022年11月16日 17:55:25

    java rules下載/java規(guī)范中文版

    使用SDK創(chuàng)建包2.5 導(dǎo)入聲明2.5.1 自動(dòng)導(dǎo)入2.5.2 冗余導(dǎo)入2.5.3 各種嵌套類(lèi)的導(dǎo)入(頂層類(lèi)或內(nèi)部類(lèi))2.5.4 編譯器對(duì)導(dǎo)入語(yǔ)句的解析2.5.5 按需類(lèi)型導(dǎo)入聲明的效能2.6 類(lèi)型聲明
    發(fā)表于 06-23 18:16

    java基礎(chǔ)知識(shí)精講視頻教程百度云盤(pán)分享!

    日歷57 java日期58 Math與Random59 內(nèi)部類(lèi)60 單例模式61 工廠模式62 線(xiàn)程的創(chuàng)建63 使用runnable創(chuàng)建線(xiàn)程64 tcp編程一65 網(wǎng)絡(luò)編程二66 對(duì)象的clone67
    發(fā)表于 07-12 11:50

    ARM之靜態(tài)變量簡(jiǎn)析

    靜態(tài)變量的值可以一直保持到程序結(jié)束,使用關(guān)鍵字static可以將變量聲明為靜態(tài)的:static int x ;static float y;根據(jù)聲明的位置不同,靜態(tài)變量也可以分為內(nèi)部類(lèi)型或外部類(lèi)
    發(fā)表于 04-24 09:27

    對(duì)在Firefly-RK3288開(kāi)發(fā)板上的Hello進(jìn)行內(nèi)存泄漏分析常見(jiàn)實(shí)例

    、GiftLetl. regNewMsgHandler后,在退出fragment后雖然手動(dòng)設(shè)為null,但是因?yàn)樵瓉?lái)那個(gè)已經(jīng)設(shè)置另一進(jìn)程而導(dǎo)致內(nèi)存泄漏實(shí)例4、內(nèi)部類(lèi)中使用宿主類(lèi)變量(截圖中是ListView的Adapter),而
    發(fā)表于 09-22 14:46

    接口、內(nèi)部類(lèi)Java API基礎(chǔ)

    理解接口的作用,理解接口和實(shí)現(xiàn)接口的類(lèi)的關(guān)系,掌握聲明接口、一個(gè)類(lèi)實(shí)現(xiàn)多個(gè)接口的聲明和使用方法。理解內(nèi)嵌類(lèi)型的概念,掌握聲明內(nèi)部類(lèi)的方法。熟悉Java語(yǔ)言包和實(shí)用包中的常用類(lèi)。
    發(fā)表于 11-23 11:52 ?0次下載

    java內(nèi)部類(lèi)分析詳解

    可以將一個(gè)類(lèi)的定義放在另一個(gè)類(lèi)的定義內(nèi)部,這就是內(nèi)部類(lèi)內(nèi)部類(lèi)是一個(gè)非常有用的特性但又比較難理解使用的特性(鄙人到現(xiàn)在都沒(méi)有怎么使用過(guò)內(nèi)部類(lèi),對(duì)內(nèi)
    發(fā)表于 09-27 14:59 ?0次下載

    java內(nèi)部類(lèi)怎么寫(xiě)

    一。內(nèi)部類(lèi)基礎(chǔ) 二。深入理解內(nèi)部類(lèi) 三。內(nèi)部類(lèi)的使用場(chǎng)景和好處 四。常見(jiàn)的與內(nèi)部類(lèi)相關(guān)的筆試面試題 若有不正之處,請(qǐng)多諒解并歡迎批評(píng)指正。 一。內(nèi)部
    發(fā)表于 09-27 16:15 ?0次下載
    <b class='flag-5'>java</b><b class='flag-5'>內(nèi)部類(lèi)</b>怎么寫(xiě)

    內(nèi)存溢出和內(nèi)存泄露的區(qū)別_內(nèi)存溢出的原因以及解決方法

    內(nèi)存溢出和內(nèi)存泄露的區(qū)別是什么?內(nèi)存溢出怎么解決?內(nèi)存溢出是指程序在申請(qǐng)內(nèi)存時(shí),沒(méi)有足夠的
    發(fā)表于 06-01 10:27 ?2943次閱讀

    Java內(nèi)部類(lèi)使用不當(dāng)導(dǎo)致內(nèi)存泄露問(wèn)題及解決辦法

    非靜態(tài)內(nèi)部類(lèi)會(huì)持有外部類(lèi),如果有地方引用了這個(gè)非靜態(tài)內(nèi)部類(lèi),會(huì)導(dǎo)致外部類(lèi)也被引用,垃圾回收時(shí)無(wú)法
    的頭像 發(fā)表于 05-18 16:09 ?1171次閱讀
    <b class='flag-5'>Java</b><b class='flag-5'>內(nèi)部類(lèi)</b>使用不當(dāng)<b class='flag-5'>導(dǎo)致</b>的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄露</b>問(wèn)題及解決辦法

    static定義內(nèi)部類(lèi)

    1. static定義內(nèi)部類(lèi) 1.1 static定義內(nèi)部類(lèi) 如果說(shuō)現(xiàn)在內(nèi)部類(lèi)上使用了static定義,那么這個(gè)內(nèi)部類(lèi)就變成了“外部類(lèi)”,s
    的頭像 發(fā)表于 10-10 16:08 ?581次閱讀

    如何在普通類(lèi)中使用內(nèi)部結(jié)構(gòu)

    class Test { public static void main ( String [] args ) { Outer outer = new Outer(); outer.fun(); }} 創(chuàng)建外部類(lèi)的實(shí)例調(diào)用外部類(lèi)的方法卻執(zhí)行了
    的頭像 發(fā)表于 10-10 16:26 ?453次閱讀

    java內(nèi)部類(lèi)可以用public修飾嗎

    使用任意訪(fǎng)問(wèn)權(quán)限修飾符,包括public、protected、默認(rèn)和private。 方法內(nèi)部類(lèi)只能使用默認(rèn)訪(fǎng)問(wèn)權(quán)限,即不加任何訪(fǎng)問(wèn)修飾符。 使用public修飾的內(nèi)部類(lèi) 內(nèi)部類(lèi)使用public修飾時(shí),可以被
    的頭像 發(fā)表于 11-21 10:23 ?1266次閱讀

    java內(nèi)存溢出的幾種原因和解決辦法

    內(nèi)存,但是如果程序中存在內(nèi)存泄漏(Memory Leak)或者使用不當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)等問(wèn)題,仍然有可能導(dǎo)致內(nèi)存溢出。下面將詳細(xì)介紹Java
    的頭像 發(fā)表于 11-23 14:44 ?6257次閱讀
    主站蜘蛛池模板: 果冻传媒 在线播放观看 | 成人AV无码一二二区视频免费看 | 麻豆XXXX乱女少妇精品-百度 | 好大太快了快插穿子宫了 | 无遮挡h肉3d动漫在线观看 | 又黄又爽又无遮挡在线观看免费 | 国产成人无码WWW免费视频在线 | 亚洲欧美综合视频 | 久久r视频 | 中国老妇xxxhd | bbwvideoa欧美老妇 | 青青精品国产自在线拍 | 国产精品久久人妻无码网站一区无 | 欧式午夜理伦三级在线观看 | 在线精彩视频在线观看免费 | 日本浴室日产在线系列 | 最美白嫩的极品美女ASSPICS | 无码欧美毛片一区二区三在线视频 | 国产真实露脸乱子伦 | 91欧美秘密入口 | 日韩国产精品欧美一区二区 | 好男人社区 | 国产精品久久久久久人妻精品流 | 亚洲精品久久国产高清 | 嫩草影院精品视频在线观看 | 日韩精品久久日日躁夜夜躁影视 | 舔1V1高H糙汉| 亚洲色婷婷久久精品AV蜜桃 | 蓝男色gay| 日产2021免费一二三四区在线 | 亚洲国产女人aaa毛片在线 | 99国产精品久久 | 亚洲中文久久久久久国产精品 | 精品国产乱码久久久久久软件 | 十8禁用B站在线看漫画 | 久久91精品国产91久 | 亚在线观看免费视频入口 | ⅹxx日本护土 | 久久精品av | 久久毛片基地 | 美女pk精子2小游戏 美女MM131爽爽爽 |