Part1情景引入
在什么情况下可能发生内存泄漏?如果想清楚这个问题的来龙去脉,看源码是必不可少的,看了源码之后你发现,实际 中实际用到 ,谜底实际就是使用了弱引用 。本文主要总结概括java中强软弱虚四种引用的特点以及区别,并且进行代码验证。
Part2强引用
强引用就是我们经常用到的方式:Object o = new Object()。这非常常见, 垃圾回收时,强引用的变量是不会被回收,即使内存溢出也不会回收,只有设置 o=null,jvm 通过,发现没有 GC root 到达对象,确定为垃圾对象后,垃圾回收器才会清理堆中的对象,释放内存。当继续申请内存分配,就会OOM。
先创建一个类,重写finalize方法:
再写一个垃圾回收的测试类:
输出结果:
Part3软引用
软引用只有在内存不够的时候才会回收, 用来描述一些还有用但并非必须的对象,JDK从 1.2 开始加入了 Reference ,SoftReference 是其中一个分类,它的作用是通过 GC root 到达对象 a,如果对象仅仅有 SoftReference ,对象 a 将会在JVM OOM之前被 jvm gc 释放掉,如果这次回收还没有足够的内存,才会抛出内存溢出异常。首先设置虚拟机参数:-Xmx20M测试类:
控制台输出:
同时也可以通过 查看 jvm 堆的使用,可以看到堆在要溢出的时候就会回收掉,空闲的内存很大的时候,你主动执行 ,内存是不会回收的。