关于这几种引用的描述可以参考这两篇文章:

https://droidyue.com/blog/2014/10/12/understanding-weakreference-in-java/

https://blog.csdn.net/mazhimazh/article/details/19752475

  • 强引用默认存在,比如Object o = new Object(); 就创建了一条强引用,除非强引用消失,否则gc将不会回收,使用o=null; System.gc(); 可模拟对象将要被回收的情况
  • 软引用比强引用低一个级别,如果一个对象只存在一个软引用,那么当内存空间不足就会回收改对象内存,否则不会回收,回收并不是实时的,如果软引用对象增加过快或者每次增加过大,也有可能引发OOM异常
  • 弱引用即是垃圾回收扫描到即回收内存,而不管内存是否足够
  • 虚引用和引用队列一起使用,用来判断对象是否被回收,实际使用较少

测试中我们可以更改VM启动参数设置内存大小,如-Xms10m -Xmx30m -Xss108k,然后更改对象增加速度和大小来验证

验证

https://github.com/icgeass/java/blob/master/src/main/java/com/zeroq6/java/corejava/reference/TestReference.java