我的 effective java -- 6.消除过期的对象引用

 6.消除过期的对象引用

 

例子:

public class Stack {
		private Object[] elements;
		private int size = 0;
		private static final int DEFAULT_INITIAL_CAPACITY = 16;
		
		public Stack(){
			elements = new Object[DEFAULT_INITIAL_CAPACITY];
		}
		
		public void push(Object e){
			ensureCapacity();
			elements[size++] = e;
		}
		
		public Object pop(){
			if(size == 0){
				 throw new EmptyStackException();
			}
			return elements[--size];
		}
		
		private void ensureCapacity(){
			if(elements.length ==  size){
				 elements = Arrays.copyOf(elements,2 * size + 1);
			}
		}
}
 

 

在支持垃圾回收的语言中,内存泄露是很隐蔽的。如果一个对象的引用被无意识的保留起来了,那么垃圾回收机制不仅不会处理这个对象,而且也不会处理被这个对象所引用的所有其他对象。即时只有少量的几个对象引用被无意识的保留下来,也会有许许多多的对象呗排除在垃圾回收机制之外,从而对性能造成潜在的重大影响。

 

此类问题的修复方法:一旦对象引用已经过期,只需清空这些引用即可,程序会立即抛出NullPointerException异常。

消除引用最好的方法是让包含该引用的的变量结束其生命周期。

 

内存泄露的诱因:

1 只要类是自己管理内存,就应该警惕内存泄露问题。如例中的‘elements’ 

2  内存泄露来源于缓存,一旦你吧对象引用放到缓存中,很容易遗忘,导致长期存在于缓存中。

处理方法:可以使用WeakHashMap ,或者由一个后台线程(Timer或者ScheduledThreadPoolExcutor)来完成,或者也可爱给缓存增加新条目的时候进行清理

3源于监听器和其他回调的内存泄露。如果你实现一个API,客户端在这个API中注册回调,却没有显性的取消注册,会造成沉积。

 

 

内存泄露剖析工具:Heap Profiler

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值