《Effective Java》 读书笔记(七)消除过期的对象引用
大概看了一遍这个小节,其实这种感觉体验最多的应该是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》 读书笔记(七)消除过期的对象引用的更多相关文章
- Effective java读书笔记
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...
- Effective Java 读书笔记之一 创建和销毁对象
一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: ...
- Effective Java 读书笔记
创建和销毁对象 >考虑用静态工厂方法替代构造器. 优点: ●优势在于有名称. ●不必再每次调用他们的时候都创建一个新的对象. ●可以返回原返回类型的任何子类型的对象. ●在创建参数化类型实例的时 ...
- Effective Java读书笔记--创建和销毁对象
1.优先考虑用静态工厂方法代替构造器2.遇到多个构造器参数时要考虑使用构建器Builder解决参数过多,不可变类型.私有构造方法,静态类的构造方法提供必要参数,剩下可选.new xxx.build() ...
- [Effective Java 读书笔记] 第二章 创建和销毁对象 第六-七条
第六条 消除过期引用 JAVA中依然会有 memory leak的,比如一个栈先增长再收缩,那么从栈中弹出的对象是不会被当做垃圾回收的,即时使用栈的程序不再引用这些对象.这是因为栈的内部维护着对这些对 ...
- Effective Java读书笔记完结啦
Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...
- Effective Java 读书笔记(一):创建和销毁对象
1 构造器 => 静态工厂方法 (1)优势 静态工厂方法有名字 静态工厂方法不必在每次被调用时都产生一个新的对象 静态工厂方法能返回原返回类型的任意子类型的对象 静态工厂方法根据调用时传入的不同 ...
- [Effective Java读书笔记] 第二章 创建和销毁对象(1~7)
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537576.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- Effective Java 读书笔记(一):使用静态工厂方法代替构造器
这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文&l ...
- Effective Java 读书笔记之九 并发
一.访问共享的可变数据时要同步 1.synchronized关键字既然保证访问的可见性也能保证原子性.而volatile修饰符只能保证变量的线程可见性. 2.增量操作符等不是原子性,多线程操作时可能导 ...
随机推荐
- Python3 学习笔记之 类型/运算符
类型/运算符: 类型: 整数 字符串 浮点数 布尔类型 类型转换: 检查类型: 算术操作符: 逻辑操作符: 优先级:
- Python3 学习笔记之 变量/字符串/if/while/逻辑运算符/模块引用
变量/if/while/逻辑运算符/模块引用: 变量: 使用变量前必须先赋值. 大小写区分. Python创建字符串,在字符串两边可以加上单引号或者双引号. 打印单引号或双引号,使用转移\ 使用\进行 ...
- Scala 学习笔记之函数(3)
class student{ def sayHello(name: => String){ println(s"Hello, $name, welcome $name") } ...
- ELK 学习笔记之 elasticsearch head插件安装
elasticsearch head插件安装: 准备工作: 安装nodejs和npm https://nodejs.org/en/download/ node-v6.11.2-linux-x64.ta ...
- Docker下配置nacos
前言 近段时间在学dubbo,dubbo-admin死活装不上,无论是本地还是docker,所以把目光投向了其他配置中心,我选定的是阿里新开源的nacos. 正文 拉取镜像到本地docker dock ...
- 链表二:链表中倒数第k个结点
题目:链表中倒数第k个结点描述:输入一个链表,输出该链表中倒数第k个结点.解决方案:思路: 根据规律得出倒数第k个节点是 n-k+1个节点 方法一:先计算出链表的长度,在循环走到n-k+1步.(相当于 ...
- 一款功能强大的TCP/UDP工具---flynet
前言 前段时间做某个项目,由于涉及到tcp/udp方面的知识比较多,于是就索性趁热打铁,写个工具来强化相关知识.另外由于并非十分擅长Golang,所以也顺便再了解下Golang吧. 简介 flynet ...
- Fcitx使用搜狗词库与皮肤
在 \(\text{Linux}\) 环境下,\(\text{Fcitx}\) 确实是最好用的开源输入法之一.然而 \(\text{Windows}\) 下的巨头输入法 -- 搜狗,对 \(\text ...
- 线程封闭之栈封闭和ThreadLocal
线程封闭 在多线程的环境中,我们经常使用锁来保证线程的安全,但是对于每个线程都要用的资源使用锁的话那么程序执行的效率就会受到影响,这个时候可以把这些资源变成线程封闭的形式. 1.栈封闭 所谓的栈封闭其 ...
- Web渗透之mssql差异备份getshell
简介 差异备份数据库得到webshell.在sql server 里dbo和sa权限都有备份数据库权限,我们可以把数据库备份称asp文件,这样我们就可以通过mssqlserver的备份数据库功能生成一 ...