文档章节

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

silence88
 silence88
发布于 2017/01/21 11:59
字数 418
阅读 6
收藏 0

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

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、内存泄漏的第三个常见来源是监听器和其他回调。

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

© 著作权归作者所有

silence88
粉丝 8
博文 71
码字总数 72855
作品 0
深圳
程序员
私信 提问
Effective_Java_Index

基于《Effective Java 第三版》的读书笔记 创建和销毁对象 第1条:用静态工厂方法代替构造器 第2条:遇到多个构造参数时要考虑用构建器 第3条:用私有构造器或者枚举类型强化Singleton属性 ...

添仔哥哥
2017/08/26
39
0
《Effective Java》读书笔记

Effective Java读书笔记 第一章:引言 第二章:创建和销毁对象 第一条:创建对象的方式 1、构造器 2、 静态方法 3、构建器 第三条::强化singleton 1、三种方式实现单例 枚举实现(最佳方式)...

磊神Ray
2011/09/06
195
0
《Effective Java》读书笔记--创建和销毁对象

考虑用静态工厂方法代替构造函数。 当我们在写一个工具类时,是不希望用户将该类实例化的,所以应该定义一个private的构造函数,而不 是将类声明成abstract,因为这样用户可以继承该类,子类...

7分04秒
2014/05/02
200
0
effective java之创建与销毁对象

最近朋友推荐了一本书《Effective Java》,觉得写得不错,写点总结笔记,以备后用。 一、创建对象 1、考虑静态工厂代替构造器 优点:(1)有明确名称。可以理解成,定义的静态方法可以给出明...

kyle1970
2012/10/31
209
0
读书笔记之《Java并发编程的艺术》-并发编程基础

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
4K
8

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 人生,还真是到处是意外

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐# 分享lil peep的单曲《High School》 《High School》- lil peep 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
37分钟前
6
0
Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
6
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
10
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部