首页 > 系统相关 >Java内部类持有外部类会导致内存泄露

Java内部类持有外部类会导致内存泄露

时间:2023-08-03 09:01:38浏览次数:40  
标签:部类 Java int static 内存 new class Inner

package org.example.a;

import java.util.ArrayList;
import java.util.List;

class Outer{
    private int[] data;

    public Outer(int size) {
        this.data = new int[size];
    }

    static class Inner {

    }

    Inner createInner() {
        return new Inner();
    }
}

public class Demo {
    public static void main(String[] args) {
        List<Object> list = new ArrayList<>();
        int counter = 0;
        while (true) {
            list.add(new Outer(100000).createInner());
            System.out.println(counter++);
        }
    }
}

如果把“static class Inner”中的static去掉就会导致内存泄漏。

因为内部类持有外部类的引用,对内部类的使用很多时,会导致外部类数目很多。此时,就算是外部类的数据没有被用到,外部类的数据所占空间也不会被释放。

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

标签:部类,Java,int,static,内存,new,class,Inner
From: https://www.cnblogs.com/privateLogs/p/17602343.html

相关文章

  • 【Java】多线程面试题总结
    最近在看面试题,所以想用自己的理解总结一下,便于加深印象。为什么使用多线程使用多线程可以充分利用CPU,提高CPU的使用率。提高系统的运行效率,对于一些复杂或者耗时的功能,可以对其进行拆分,比如将某个任务拆分了A、B、C三个子任务,如果子任务之间没有依赖关系,那么就可以使用多线程......
  • java-房屋出租系统实现
    房屋出租系统项目需求能够实现对房屋信息的添加、修改和删除(用数组实现),并能够打印房屋明细表项目界面主菜单新增房源查找房源删除房源修改房源房屋列表退出系统项目设计项目实现显示主菜单在HouseView.java中,编写一个方法mainMenu,显示菜单点击查看代码......
  • JavaScript中的 "return await promise" 与 "return promise"
    原文地址:'returnawaitpromise'vs'returnpromise'inJavaScript原文作者:DmitriPavlutin译文出自:翻译计划当从异步功能中返回时,您可以等待该承诺得到解决,或者您可以直接返回它:returnawaitpromisereturnpromise:jsasyncfunctionfunc1(){constpromise=asyncOperat......
  • 我需要 把 目标数据源中的表 获取到表的字段和字段的类型等信息,然后在目标数据源中创
    当涉及到将Oracle数据库字段类型映射为MySQL数据库字段类型时,考虑到不同数据库的差异和复杂性,以下是一个更全面的映射示例,涵盖了更多的Oracle字段类型及其可能的MySQL对应类型。importjava.util.HashMap;importjava.util.Map;publicclassOracleToMySQLTypeConverter{......
  • Java面试题 P42:框架篇:Spring-Spring框架中的单例bean是线程安全的吗?Spring框架中的bea
        ......
  • 3.使用智能指针管理内存资源,RAII是怎么回事?
    3.使用智能指针管理内存资源,RAII是怎么回事?什么是RAII?RAII是ResourceAcquisitionIsInitialization(wiki上面翻译成“资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时......
  • 2.简要说明C++的内存分区
    2.简要说明C++的内存分区1.一个由C/C++编译的程序占用的内存分为以下几个部分:C++中的内存分区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区和代码区。如下图所示栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈......
  • 3.什么是内存池,如何实现
    3.什么是内存池,如何实现内存池(MemoryPool)是一种内存分配方式。通常我们习惯直接使用new、malloc等申请内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情......
  • 4.可以说一下你了解的C++得内存管理吗?
    4.可以说一下你了解的C++得内存管理吗?1.一个由c/C++编译的程序占用的内存分为以下几个部分:C++中的内存分区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区和代码区。如下图所示栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自......
  • 5.C++中类的数据成员和成员函数内存分布情况
    5.C++中类的数据成员和成员函数内存分布情况非静态成员的数据类型大小之和。编译器加入的额外成员变量(如指向虚函数表的指针)。为了边缘对齐优化加入的padding。空类(无非静态数据成员)的对象的size为1,当作为基类时,size为0。C++类是由结构体发展得来的,所以他们的成员变......