欢迎来到刘志红的博客

别人说程序员是“搬砖”的码农,但我们知道自己是追求个性的艺术家。也许我们不会过多的在意自己的外表和穿着,但在不羁的外表下,骨子里追求着代码的美、系统的美、设计的美。
扩大
缩小

effective解读-第七条 消除过期的对象引用???

java有GC,但是GC不会回收有引用指向的对象。有些情况对象引用被无意识的保留下来导致其指向的对象不能被回收,久而久之就会造成OOM。清空对象引用不是一种规范行为,而是一种例外。因为大多数引用会随着方法结束弹栈而自动消除。但是有一类引用,如存储池、守护线程等中的对象会自己管理内存,这种情况如果不及时置空引用就会导致对象一直被引用所指,这样对象不会被释放而最终导致OOM

  1. 内存泄漏来源1,池中对象引用。典型的案例就是ThreadLocal。Java 8的ThreadLocal模型(从马士兵老师的讲解的ThreadLocal课程中截来的,如有侵权联系即删除),所以使用完毕后需要手动调用remove来清空ThreadLocal对象。

  2. 内存泄漏来源2,缓存。对象放在缓存中很容易被遗忘,如果使用的是强引用那么缓存对象会一直堆叠。

    解决办法:

    1.使用弱引用,在内存不足的时候自动清除引用。

    2.使用后台线程如ScheduledThreadPoolExecutor、Timer等来定时置空引用3.对于复杂的缓存使用java.lang.ref????对于第三点不理解求大神指点

    3.内存泄漏来源3,监听器和其他回调。 最佳解决办法保存其弱引用????对于第三点不是很理解求大神指点

总结:内存泄漏不会表现明显的失败,有时候可能在一个系统存在很多年。往往通过代码检查或者Heap剖析工具才能发现该类问题。

 

 

posted on 2021-03-27 11:13  MR_程序猿刘  阅读(68)  评论(0编辑  收藏  举报

导航