《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.增量操作符等不是原子性,多线程操作时可能导 ...
随机推荐
- SUSE CaaS Platform 4 - Ceph RBD 作为 Pod 存储卷
RBD存储卷 目前 CaaSP4 支持多种 Volume 类型,这里选择 Ceph RBD(Rados Block Device),主要有如下好处: Ceph 经过多年开发,已经非常熟,社区也很活跃: ...
- 让你如绅士般基于描述编写 Python 命令行工具的开源项目:docopt
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- Openshift创建Router和Registry
Openshift创建Router和Registry: [root@DockerServer openshift]# oadm policy add-scc-to-user privileged sy ...
- python爬虫入门10分钟爬取一个网站
一.基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序. 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT ...
- Tomcat7.0.40注册到服务启动报错error Code 1 +connector attribute sslcertificateFile must be defined when using ssl with apr
Tomcat7.0.40 注册到服务启动遇到以下几个问题: 1.启动报错errorCode1 查看日志如下图: 解决办法: 这个是因为我的jdk版本问题,因为电脑是64位,安装的jdk是32位的所以会 ...
- MySql + Workbench使用教程
Mysql安装及使用 注意:不推荐下载zip版本,需要配置额外的环境变量和其他设置,很复杂.官方的windows安装版本可以自动完成所有操作. 下载地址:https://dev.mysql.com/d ...
- 部署主从dns
主机部署:yum安装DNS服务和依赖 [admin@haifly-bj-dns1 ~]$ sudo yum install bind-chroot启动named-chroot服务 [admin@hai ...
- Spring Boot 2.2 正式发布,大幅性能提升 + Java 13 支持
之前 Spring Boot 2.2没能按时发布,是由于 Spring Framework 5.2 的发布受阻而推迟.这次随着 Spring Framework 5.2.0 成功发布之后,Spring ...
- 移动端自动化测试Appium 从入门到项目实战Python版☝☝☝
移动端自动化测试Appium 从入门到项目实战Python版 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 说到APP自动化测试,Appium可是说是非常流 ...
- 攻防世界(XCTF)逆向部分write up(一)
晚上做几个简单的ctf逆向睡的更好 logmein elf文件 ida看看main函数伪代码 void __fastcall __noreturn main(__int64 a1, char **a2 ...