effective java读书笔记6:消除过期的对象引用

Java内存管理与泄漏
本文探讨了Java中内存管理的基本原则及可能导致内存泄漏的情况,包括未清除的对象引用、缓存管理不当以及监听器和其他回调引起的内存泄漏问题。

解读:如果一个对象的引用没有断开(实际这个对象已经没有用了),这个对象占用的堆空间就不会释放掉,造成不必要的内存泄漏

1、如果一个类是自己管理内存的,则要警惕内存泄漏。

因为既然是自己管理内存,那么对于内存的释放当然也要自己注意。看下面的一个类。

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];
	}

	/**
	 * Ensure space for at least one more element, roughly doubling the capacity
	 * each time the array needs to grow.
	 */
	private void ensureCapacity() {
		if (elements.length == size)
			elements = Arrays.copyOf(elements, 2 * size + 1);
	}
}

对于pop方法,一个单元弹出栈后,指向这个单元的引用就过期了,需要清空该引用。改进的方法非常简单,对于该引用指向null即可。

	public Object pop() {
		if (size == 0)
			throw new EmptyStackException();
		Object result = elements[--size];
		elements[size] = null;
		return result;
	}

当然关于清空对象的引用不用改过分地太注意,正如文中说的:清空对象引用只是一种例外,不是一种规范行为。

2、内存泄漏的另一个常见来源是缓存。

这一点的理解比较模糊,后面再补充,这点提到了强引用,弱引用,以及WeakHashMap,以及java.lang.ref包,都是知识盲点,后面补充。

3、内存泄漏的第三个常见来源是监听器和其他回调。

这一点文中简单提了,没搞明白,后面慢慢理解补充。

转载于:https://my.oschina.net/silence88/blog/828788

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值