大概看了一遍这个小节,其实这种感觉体验最多的应该是C/C++程序,有多杀少个new就得有多个delete.

一直以为Java就不会存在这个问题,看来是我太年轻。

感觉《Effective Java》里面每句话都是浓缩的精华,第一次看就想要明白是什么,为什么,怎么办,还是再去看看资料,《Effective Java》只是作为一个引言提出这一点。

消除过期对象的引用,推荐先看看博客

1.内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏

2.长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏(比如将对象放入各种集合中)

3.预防内存泄露的办法在于当长生命周期不使用引用短声明周期的时候,将其设置为null

4.常见的内存泄露:

  • 静态集合类引用对象后,未及时的remove()掉。
  • 对象在被添加进集合之后再被修改,误以为remove()成功,详见上面的博客 PS:博客下面一直在争论为什么会出现这样的情况,我认为之所以会觉得有争议是因为所有人都知道集合add的是对象的应用,当对象变化的时候,通过引用访问这个对象的时候也应该能感知到变大,但是容易被忽略的一点是对象被加入到集合中的时候,集合里记录的该对象的hash值就被确定了,并且是拷贝而不是引用(hash值是int类型),所以无论对象怎么变化,集合里面记录的hash值都不会受到影响。
  • 监听器,当我们调用一个控件的addListener()来增加监听器的时候,往往在释放这个控件对象的时候,会忘记删除这些监听器。
  • 各种资源操作。比如数据库连接(dataSource.getConnection())网络连接(socket)还有IO,除非显示的调用close()方法。否则资源是不会被GC回收的。建议使用try-with-resource,jdk1.7新特性,能让代码更加简洁,而且能够AutoClose  PS:为什么不调用close()方法IO资源就无法被释放呢?大概查询了下资料是这样说的:JVM是通过jni调用操作系统的IO库实现的,当我们创建一个IO流对象的时候,操作系统本身也产生了某种资源,如果不调用close方法,GC只会回收掉jvm的资源,但是操作系统的资源只能通过调用close()方法显示关闭系统资源。那为什么不直接把close()方法放在资源对象的析构函数里,这样在JVM回收对象的时候就能顺便回收系统资源了,但是GC回收的时间是不确定的,如果调用频繁而不close的话,操作系统资源会来不及回收,而可能导致其他系统问题,但是可以将close()放析构函数中作为一种安全保障
  • 类/单例类之间的依赖

值得注意的是消除对象引用应该是例外而不是规范。可以在平时多加注意这些问题,而不是在程序结束后将所有对象的应用设为null。

《Effective Java》 读书笔记(七)消除过期的对象引用的更多相关文章

  1. Effective java读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...

  2. Effective Java 读书笔记之一 创建和销毁对象

    一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: ...

  3. Effective Java 读书笔记

    创建和销毁对象 >考虑用静态工厂方法替代构造器. 优点: ●优势在于有名称. ●不必再每次调用他们的时候都创建一个新的对象. ●可以返回原返回类型的任何子类型的对象. ●在创建参数化类型实例的时 ...

  4. Effective Java读书笔记--创建和销毁对象

    1.优先考虑用静态工厂方法代替构造器2.遇到多个构造器参数时要考虑使用构建器Builder解决参数过多,不可变类型.私有构造方法,静态类的构造方法提供必要参数,剩下可选.new xxx.build() ...

  5. [Effective Java 读书笔记] 第二章 创建和销毁对象 第六-七条

    第六条 消除过期引用 JAVA中依然会有 memory leak的,比如一个栈先增长再收缩,那么从栈中弹出的对象是不会被当做垃圾回收的,即时使用栈的程序不再引用这些对象.这是因为栈的内部维护着对这些对 ...

  6. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

  7. Effective Java 读书笔记(一):创建和销毁对象

    1 构造器 => 静态工厂方法 (1)优势 静态工厂方法有名字 静态工厂方法不必在每次被调用时都产生一个新的对象 静态工厂方法能返回原返回类型的任意子类型的对象 静态工厂方法根据调用时传入的不同 ...

  8. [Effective Java读书笔记] 第二章 创建和销毁对象(1~7)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537576.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  9. Effective Java 读书笔记(一):使用静态工厂方法代替构造器

    这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文&l ...

  10. Effective Java 读书笔记之九 并发

    一.访问共享的可变数据时要同步 1.synchronized关键字既然保证访问的可见性也能保证原子性.而volatile修饰符只能保证变量的线程可见性. 2.增量操作符等不是原子性,多线程操作时可能导 ...

随机推荐

  1. Python多任务之线程

    多任务介绍 我们先来看一下没有多任务的程序 import time def sing(): for i in range(5): print("我喜欢唱") time.sleep( ...

  2. API文档注释 Javadoc

    阅读API文档 JDK包结构 JDK包是由sun开发的一组已经实现的类库,.JDK根据提供的功能不同,将类库划分为若干个包,比如用于操作输入输出的  java.io包,java程序语言设计基础类的   ...

  3. Vim 使用 DrawIt 画图

    简介 DrawIt 插件用来在 Vim 中进行简单的画图功能.可以方便地移动光标并画出横线.竖线.斜线.箭头和交叉字符,也带有实用的画图功能,轻松画带箭头的线.矩形及椭圆. 官方主页:https:// ...

  4. 工业搬运机器人(AGV)为什么要选择视觉导航

    在智能制造和仓储物流领域,搬运机器人的需求量在逐年上升.机器人(AGV)的种类千差万别,如何选择成为需求方头痛的问题. 本文将从客户关心的多个方面,对市面上的常见的工业级导航方案做一个比较. 搬运机器 ...

  5. Ubuntu16.04安装Docker、nvidia-docker

    Ubuntu16.04安装Docker.nvidia-docker Docker安装 1.更换国内软件源,推荐中国科技大学的源,稳定速度快(可选) sudo cp /etc/apt/sources.l ...

  6. Spring Cloud 入门系列(一)

    前言 Spring Could作为目前最流行基于Java开发的构建微服务的完整框架.发现目前相关系列教程太少,本文是基于官网教程做的一套翻译. 何为Spring Cloud? Spring Cloud ...

  7. Go routine 编排框架:oklog/run 包

    目录 Go routine 编排框架:oklog/run 包 问题引入 oklog/run 包介绍 使用例子 参考资料 Go routine 编排框架:oklog/run 包 问题引入 oklog/r ...

  8. powershell(一)

    Windows powershell是一种命令行外壳程序和脚本环境,它内置在win7以上版本的操作系统中,使命令行用户和脚本编写者可以利用.NET Framework的强大功能.powershell程 ...

  9. Web安全之爆破中的验证码识别~

    写爆破靶场的时候发现对于爆破有验证码的有点意思~这里简单总结下我们爆破有验证码的场景中几种有效的方法~~~ 0x01 使用现成工具 这里有pkav团队的神器PKAV HTTP Fuzzer 1.5.6 ...

  10. c++11::std::optional

    std::optional还有一个类似于智能指针的接口, 它可以显式转化为bool来表示std::optional是否有一个值. 指针的解引用操作符*和->都实现了, 但是没有std::bad_ ...