消除过期对象的引用

过期引用 – 在操作集合类的时候,未清理过期的对象引用(即:过期引用),常会导致内存泄露.从而报outOfmemory错误.

1.过期对象导致内存泄漏.

2.一旦对象引用过期,清除这些引用

3.如果一个过期对象中引用了其他对象,那么其引用的对象也不会被清除

4.WeakHashMap代表缓存时,过期将自动清除缓存(当所要的缓存项的生命周期是由该键的外部引用而不是值决定时,WeakHashMap才有用处)

5.LinkedHashMap 给缓存添加新条目的时候顺便清理缓存

例子

“`

public class StackMemory {

public Object[] elements;

public int size = 0;
//private static final int DEFAULT_INITIAL_CAPACITY = 16;
public StackMemory(int DEFAULT_INITIAL_CAPACITY){
elements = new Object[DEFAULT_INITIAL_CAPACITY];
} public void push(Object e){
ensureCapacity();
elements[size++] = e;
} /**
*
* @return 让一个栈先增长后收缩,从栈中弹出来的对象永远不会被当做垃圾回收
*/
public Object pop(){
if(size == 0)
throw new EmptyStackException(); //一旦对象引用过期,清空引用
//清空elements[]并返回result 此时result只有 elements[--size]的值(一个)
Object result = elements[--size];
elements[size] = null;
return result; //直接返回object[] 没有将其清空
//return elements[--size];
} private void ensureCapacity() {
// TODO Auto-generated method stub
if(elements.length == size){
elements = Arrays.copyOf(elements, 2*size+1);
}
}

}

测试代码

for (int i = 0; i < 9; i++) {

String str = “testStackMemory” + i;

stackMemory.push(str);

}

String strB = new String((String) stackMemory.pop());

System.out.println(strB + ” “);

System.out.println(stackMemory.elements[8]);

“`如果不清空对象引用的话,将会返回三个testStackMemory8,否则,输出结果为testStackMemory8,null,null

EffectiveJava(6)消除过期对象的引用的更多相关文章

  1. 《Effective Java》 读书笔记(七)消除过期的对象引用

    大概看了一遍这个小节,其实这种感觉体验最多的应该是C/C++程序,有多杀少个new就得有多个delete. 一直以为Java就不会存在这个问题,看来是我太年轻. 感觉<Effective Jav ...

  2. Effective Java 第三版——7. 消除过期的对象引用

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  3. Java 消除过期的对象引用

    内存泄漏的第一个常见来源是存在过期引用. import java.util.Arrays; import java.util.EmptyStackException; public class Sta ...

  4. “吃人”的那些Java名词:对象、引用、堆、栈

    记得中学的课本上,有一篇名为<狂人日记>课文:那时候根本理解不了鲁迅写这篇文章要表达的中心思想,只觉得满篇的“吃人”令人心情压抑:老师在讲台上慷慨激昂的讲,大多数的同学同我一样,在课本面前 ...

  5. Item 6 消除过期的对象引用

    过期对象引用没有清理掉,会导致内存泄漏.对于没有用到的对象引用,可以置空,这是一种做法.而最好的做法是,把保存对象引用的变量清理掉,多用局部变量.   什么是内存泄漏? 在Java中,对象的内存空间回 ...

  6. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  7. static成员变量与返回对象的引用

    (1)用static修饰类成员变量(属性),表明该变量是静态的,无论创建多少对象,都只创建一个一个静态属性副本,也就是对象们共享同一个静态属性,这个方法常用的一个用途就是用来计算程序调用了多少次这个类 ...

  8. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

  9. Python 对象的引用计数和拷贝

    Python 对象的引用计数和拷贝 Python是一种面向对象的语言,包括变量.函数.类.模块等等一切皆对象. 在python中,每个对象有以下三个属性: 1.id,每个对象都有一个唯一的身份标识自己 ...

随机推荐

  1. css 实现高斯模糊

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 斗地主(NOIP2015)

    原题传送门 神奇的题目.. 一开始我准备打暴力直接搜答案. 然后发现.. 无限TLE.. 因为O((logN)^14*T)BOOM.. 然后Zxyer告诉可以只DFS顺子...其他的可以一步搞出来.. ...

  3. java基础练习 16

    public class Sixtheen { /*利用递归方法求5!.*/ public static void main(String[] args){ System.out.println(&q ...

  4. 查看gcc/g++默认include路径

    转自:http://gcc.gnu.org/ml/gcc-help/2007-09/msg00205.html `gcc -print-prog-name=cc1plus` -v `g++ -prin ...

  5. 使用log4j2分离系统日志与业务日志

    前一篇文章介绍了log4j2 扩展日志级别,支持将系统日志与业务处理日志拆分,现在介绍一下通过日志级别将系统日志与业务日志分类,要达到这个目的很容易,只需要配置一下log4j的xml文件: <? ...

  6. wsgi的学习(1):什么是WSGI

    本文来自:http://www.nowamagic.net/academy/detail/1330310 WSGI,全程是:Web Server Gateway Interface,或者python  ...

  7. 通过字典传递django orm的filter功能

    class AppRightManageListView(ListView): template_name = 'rightmanage/list_apprightmanage.html' # mod ...

  8. AC日记——最小正子段和 51nod 1065

    最小正子段和 思路: 找最小的大于0的sum[j]-sum[i](j>i): 高级数据结构(splay)水过: 来,上代码: #include <cstdio> #include & ...

  9. js百度地图-简单的1个坐标点

    要学习百度地图,最好的地方就是去看百度地图API: 案例: <!DOCTYPE html> <html> <head> <meta http-equiv=&q ...

  10. Cosmos DB

    类似的数据库还有Google的Spanner. 参考:官网说明 另一个介绍 Key capabilities As a globally distributed database service, A ...