美文网首页effectivejava程序员
消除过期的对象引用

消除过期的对象引用

作者: 想飞的僵尸 | 来源:发表于2016-06-25 23:13 被阅读383次

第6条:消除过期的对象引用


1. 为什么要消除过期的对象引用

java虽然有自己的垃圾回收机制,但是并没有那么的智能,对于被引用的对象,就算我们已经不在使用它了,但是java的回收机制是不会回收他们的,人们称之为“内存泄漏”。

2. 无意识的对象引用

很多时候内存泄漏都是“人们无意识的内存引用”造成的,举个简单的例子:

List<String> list = new ArrayList<>();
String str = "testString";
list.add(str);
str  = null;

上面的代码在创建str时的开辟的内存空间被回收了么?答案是否定的,list依然持有对str的引用,所以创建str时所开辟的内存空间是不会被回收的,这就是一个典型的“无意识的内存引用”。为了防止这些“无意识的内存引用”,我们应该了解对象相互引用的时候是存在怎样的依赖关系的。

3. 一个例子秒懂对象间相互依赖是怎样的

问题:

Object object1 = new Object();
Object object2 = object1;
Object object3 = object2;

请问object1, object2, object3和new出来的内存空间是怎样相互引用的呢?

  • 选项A:


    选项A.png
  • 选项B:


    选项B.png

直接给答案,正确答案是B。
所以说下面这段代码,new 出来的那片内存空间是不会被回收的,因为object2和object3还在持有这片内存的引用。

Object object1 = new Object();
Object object2 = object1;
Object object3 = object2;
object1 = null;

4. 对于内存泄漏不要过分紧张

不要因为害怕内存泄漏而在所有的地方都手动回收内存,这样会导致我们的代码凌乱臃肿,不利于管理,我们应该把目标集中在那些长声明周期的变量中,哪些是长生命周期的变量呢,最明显的一个就是static修饰的变量,我们应该把目光放在这些变量上。

5. 解决之道

对于长生命周期的变量,我们可以进行手动回收,或者使用弱引用(WeakReference),java中的引用分好多种,想要学习可以bing或是google,这部分内容有点多,而我又已经差不多懂了,所以就不记录这么多了。


本篇文章到此结束。

相关文章

  • 消除过期的对象引用

    第6条:消除过期的对象引用 1. 为什么要消除过期的对象引用 java虽然有自己的垃圾回收机制,但是并没有那么的智...

  • 消除过期的对象引用

    你能看出以下代码哪里内存泄漏吗? 答案是: pop()方法存在内存泄漏。 内存泄漏可以称为“ 无意识的对象保持(u...

  • 消除过期的对象引用

    什么是过期的对象引用? 我们通过简单的栈实现来引入过期的对象引用。 实际上,这段程序中并没有很明显的错误。无论如何...

  • 消除过期的对象引用

    某些类内部维护着对象的过期引用(指永远也不会再被解除的引用),这些对象不会被当作垃圾回收,产生了内存泄露(这类内存...

  • 消除过期的引用对象

    C或者C++是手工管理内存语言,java语言是自带垃圾回收,程序员的工作就很容易,因为当你用完了对象之后,他会被自...

  • 消除过期的对象的引用

    一、消除过期的对象的引用的好处 好处1、防止内存泄漏,导致磁盘交换,甚至会导致程序失败好处2、如果错误地解除引用,...

  • 1.7消除过期的对象引用

    1.7消除过期的对象引用 1.7.1 ​ 以下代码并没有明显的错误,无论如何测试,它都会成功通过每一项测...

  • Effective Java 第二章

    避免创建不必要的对象 优先考虑使用基本类型而不是装箱类型,要当心无意识的自动装箱 消除过期对象的引用 一旦对象引用...

  • 06-消除过期对象引用

    阅读原文 06-消除过期对象引用   01 - 当你从手工管理内存的语言转换到具有垃圾回收功能的语言的时候,程序员...

  • 6.消除过期的对象引用

    我们用java管理内存是十分容易的,因为jvm会帮我管理内存的释放,但是这不意味着我们不用担心内存的事情了 造成内...

网友评论

    本文标题:消除过期的对象引用

    本文链接:https://www.haomeiwen.com/subject/zzuadttx.html