Java内存泄露系列--内部类持有外部类导致内存泄露--原因/解决方案

た 入场券 2023-10-02 13:47 15阅读 0赞

原文网址:Java内存泄露系列—内部类持有外部类导致内存泄露—原因/解决方案_IT利刃出鞘的博客-CSDN博客

简介

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

为什么内部类持有外部类会导致内存泄露?

非静态内部类会持有外部类,如果有地方引用了这个非静态内部类,会导致外部类也被引用,垃圾回收时无法回收这个外部类(即使外部类已经没有其他地方在使用了)。

解决方案

  1. 不要让其他的地方持有这个非静态内部类的引用,直接在这个非静态内部类执行业务。
  2. 将非静态内部类改为静态内部类。

    1. 内部类改为静态的之后,它所引用的对象或属性也必须是静态的,所以静态内部类无法获得外部对象的引用,只能从 JVM 的 Method Area(方法区)获取到static类型的引用。

相关网址

匿名内部类的内存泄露:Java—匿名内部类导致内存泄露的原因和解决方案 - 自学精灵

为什么要持有外部类

Java 语言中,非静态内部类的主要作用有两个:

  1. 当内部类只在外部类中使用时,匿名内部类可以让外部不知道它的存在,从而减少了代码的维护工作。
  2. 当内部类持有外部类时,它就可以直接使用外部类中的变量了,这样可以很方便的完成调用,如下代码所示:

    package org.example.a;

    class Outer{

    1. private String outerName = "Tony";
    2. class Inner{
    3. private String name;
    4. public Inner() {
    5. this.name = outerName;
    6. }
    7. }
    8. Inner createInner() {
    9. return new Inner();
    10. }

    }

    public class Demo {

    1. public static void main(String[] args) {
    2. Outer.Inner inner = new Outer().createInner();
    3. System.out.println(inner);
    4. }

    }

但是,静态内部类就无法持有外部类和其非静态字段了。比如下边这样就会报错

  1. package org.example.a;
  2. class Outer{
  3. private String outerName = "Tony";
  4. static class Inner{
  5. private String name;
  6. public Inner() {
  7. this.name = outerName;
  8. }
  9. }
  10. Inner createInner() {
  11. return new Inner();
  12. }
  13. }
  14. public class Demo {
  15. public static void main(String[] args) {
  16. Outer.Inner inner = new Outer().createInner();
  17. System.out.println(inner);
  18. }
  19. }

报错:

a391a4aad24c05e39ce870ce95aca903.png

实例:持有外部类

上边是文章的部分内容,为便于维护,全文已迁移到此网址:Java-内部类持有外部类导致内存泄露的原因和解决方案 - 自学精灵

发表评论

表情:
评论列表 (有 0 条评论,15人围观)

还没有评论,来说两句吧...

相关阅读