effective解读-第七条 消除过期的对象引用???
java有GC,但是GC不会回收有引用指向的对象。有些情况对象引用被无意识的保留下来导致其指向的对象不能被回收,久而久之就会造成OOM。清空对象引用不是一种规范行为,而是一种例外。因为大多数引用会随着方法结束弹栈而自动消除。但是有一类引用,如存储池、守护线程等中的对象会自己管理内存,这种情况如果不及时置空引用就会导致对象一直被引用所指,这样对象不会被释放而最终导致OOM
-
内存泄漏来源1,池中对象引用。典型的案例就是ThreadLocal。Java 8的ThreadLocal模型(从马士兵老师的讲解的ThreadLocal课程中截来的,如有侵权联系即删除),所以使用完毕后需要手动调用remove来清空ThreadLocal对象。
-
内存泄漏来源2,缓存。对象放在缓存中很容易被遗忘,如果使用的是强引用那么缓存对象会一直堆叠。
解决办法:
1.使用弱引用,在内存不足的时候自动清除引用。
2.使用后台线程如ScheduledThreadPoolExecutor、Timer等来定时置空引用3.对于复杂的缓存使用java.lang.ref????对于第三点不理解求大神指点
总结:内存泄漏不会表现明显的失败,有时候可能在一个系统存在很多年。往往通过代码检查或者Heap剖析工具才能发现该类问题。
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!