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

    浏览量

    19976
  • JVM
    JVM
    +关注

    关注

    0

    文章

    152

    浏览量

    12145

原文标题: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 608次阅读

    MP3使用不当会造成的健康问题

    MP3使用不当会造成的健康问题 别看MP3这个小数码产品,如果不正确使用说不定会损害你的身体健康。
    发表于 02-01 17:20 425次阅读

    热水器使用不当易漏电伤人

    热水器使用不当易漏电伤人     重庆市消委近日发出消费警示,提醒消费者应谨慎购买使用电热水器,以防发生漏电伤人事故。 &nb
    发表于 02-21 16:47 957次阅读

    物理内存使用率高的原因及解决办法

    主要讲解的就是物理内存使用率高的原因以及他的解决办法导致物理内存使用率高有几种可能,而最常见的则有两种:一是安装不好的程序,内存被占用太多
    发表于 05-03 17:14 9165次阅读
    物理<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 1048次阅读

    Java内部类持有外部类导致内存泄露的原因以及其解决方案

    简介 为什么要持有外部类 实例:持有外部类 实例:不持有外部类 实例:内存泄露 不会内存
    的头像 发表于 10-08 16:32 805次阅读

    java内部类可以用public修饰吗

    Java内部类是指一个类被定义在另一个类的内部。根据定义的位置和访问权限的不同,内部类可以分为四种:成员内部类、静态
    的头像 发表于 11-21 10:23 553次阅读

    java内存溢出的几种原因和解决办法

    内存,但是如果程序中存在内存泄漏(Memory Leak)或者使用不当的数据结构等问题,仍然有可能导致内存溢出。下面将详细介绍
    的头像 发表于 11-23 14:44 4293次阅读

    M16连接器8芯使用不当会出现什么情况

      德索工程师说道M16连接器8芯,作为一种高性能的电气连接器件,其正确使用对于整个系统的稳定性和安全性至关重要。然而,如果使用不当,可能会引发一系列问题,从而影响系统的正常运行。以下是关于M16连接器8芯使用不当可能出现的情况的详细分析:
    的头像 发表于 06-06 17:39 273次阅读
    M16连接器8芯<b class='flag-5'>使用不当</b>会出现什么情况