当前位置:首页 > 开发 > 编程语言 > Java > 正文

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

发表于: 2012-07-23   作者:12616383   来源:转载   浏览:
摘要:  6.消除过期的对象引用   例子: public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack(){ ele

 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

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

推荐文章
编辑推荐
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号