《Effective Java》 读书笔记(七)消除过期的对象引用
2024-08-31 23:28:25
大概看了一遍这个小节,其实这种感觉体验最多的应该是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。
最新文章
- Win7 命令行强制杀死进程
- 【Java EE 学习 72 上】【数据采集系统第四天】【增加调查logo】【文件上传】【动态错误页指定】【上传限制】【国际化】
- 用CSS制作带图标的按钮
- SQL Server COM 组件创建实例失败
- Multimedia&;Network
- flash recovery area配置
- SSH三大框架整合使用的配置文件 注解实现
- Linux通过网卡驱动程序和版本号的信息
- Office 365 - SharePoint 2013 Online之加入App开发工具Napa
- Hadoop之Secondary NameNode
- python中网络编程之线程
- js在前端json字符串和对象互相转化
- How to flash Havoc on enchilada
- svn创建分支(branch/tag)出现“path”already exists
- Spring的编程式事务和声明式事务
- eslint 代码检测工具
- MySql安装成功后无法远程登录
- (error) MOVED 5798 172.17.0.3:6379
- SQL SERVER 事务相关
- Git学习 之 安装
热门文章
- ELK 学习笔记之 Logstash安装
- 04-04 AdaBoost算法代码(鸢尾花分类)
- python编程基础之十五
- Python3 解决 ModuleNotFoundError: No module named 'pygal.i18n' 问题
- Hyper-V 下linux虚拟机静态IP上网配置的两种方式(1)
- 采用WPF开发截图程序,so easy!
- Python从入门到精通视频(全60集) ☝☝☝
- LRU算法实现,HashMap与LinkedHashMap源码的部分总结
- python 报错TypeError: 'range' object does not support item assignment,解决方法
- Cymothoa后门工具