Handler 内存泄漏

前提

内存泄漏

当系统运行到某一时刻,某些占用着一定内存空间的操作或对象在之后都不会使用了,所以此时系统理应将这些内存空间给释放掉给接下来的系统运行使用,但是因为一些特殊的原因,从而导致这部分的内存空间一直无法释放,而这些无法释放的内存空间就会一直无法有效的被系统利用,俗称占着茅坑不拉屎,这一现象称之为内存泄漏。

危害:一次内存泄漏并不会导致太大的问题,但如果不断累积多次内存泄漏,那么系统内存空间中的不可在被利用的内存将会越来越多,而可重复利用的内存越来越少,最终导致系统无法在从内存空间中申请内存运行程序,系统也就会报内存溢出(OOM)异常。

Java内部类和匿名内部类

Java语法中,如果在某个类中定义了非静态的内部类或者匿名内部类,那么这些非静态的内部类或者匿名内部类的实例对象必定会隐式的强引用其外部类的实例对象。

例子:

	public class Other {
   
	}
	public class Outer {
   
	
	    // 非静态的内部类
	    public class Inner {
   
	        public String publicString = "Inner.publicString";
	    }
	
	    public Inner getInner(){
   
	        // new Inner()创建的对象内部必定持有Outer类的一个实例对象
	        return new Inner();
	    }
	
	    // 非静态的匿名内部类的对象,其内部必定持有Outer类的一个实例对象
	    public Other other = new Other(){
   
	        public void fun(){
   };
	    };
	
	    public Other getOther(){
   
	        return other;
	    }
	
	    public Other getOthers(){
   
	        // 非静态的匿名内部类的对象,其内部必定持有Outer类的一个实例对象
	        Other other = new Other(){
   
	            public void fun(){
   };
	        };
	        return other;
	    }
	}

	Outer outer = new Outer();
			
	// inner1对象内部必定隐式的持有outer对象
	Outer.Inner inner1 = outer.new Inner();
	// inner2对象内部必定隐式的持有outer对象
	Outer.Inner inner2 = outer.getInner();
	
	// other1对象内部必定隐式的持有outer对象
	Other other1 = outer.getOther();
	// other2对象内部必定隐式的持有outer对象
	Other other2 = outer.getOthers();

要想消除非静态的内部类或者匿名内部类的实例对象隐式的强引用其外部类的实例对象,只有将这些内部类或者匿名内部类声明为静态的内部类或者匿名内部类。

例子:

	public class Other {
   
	}
	public class Outer {
   
	
	    // 静态的内部类
	    static public class Inner {
   
	        public String publicString = "Inner.publicString";
	    }
	
	    public Inner getInner(){
   
	        return new Inner()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值