Java对象引用的4个级别:强引用 > 软引用 > 弱引用 > 虚引用
强引用:
强引用存在时,对象就不会被GC回收掉,Jvm宁愿抛出OOM异常,也不会在GC时回收掉该对象。
测试代码:
1 | byte[] arr = null; |
输出结果:
1 | arr new: [B@1b6d3586 |
从输出结果可以看出,强引用对象在引用存在时,gc是不会回收的;当内存不足时,gc也不会强制回收,而是宁愿抛出OOM异常。这里说明一下:输出中**[B1b6d3586**的含义是=> [:表示数组,B:表示Byte类型,1b6d3586:对象的hash值。
软引用
软引用存在时,在内存充足时,不会被gc回收掉,当内存不足时,会被gc回收。
测试代码:
1 | SoftReference<byte[]> arr = null; |
输出结果:
1 | arr new: [B@1b6d3586 |
从输出结果可以看出,软引用在引用存在时,只有当内存充足时,才不会被gc回收,否则当内存不足时,gc会强制回收软引用对象占用的空间。
弱引用
弱引用存在时,只要触发了gc,弱引用对象就会被强制回收,无论此时jvm内存空间是否充足。
测试代码:
1 | WeakReference<byte[]> arr = null; |
输出结果:
1 | arr new: [B@1b6d3586 |
从输出结果可以看出,弱引用在引用存在时,只要触发了gc,弱引用就会被gc回收掉。
虚引用
虚引用存在时,一般由堆外内存控制虚引用,类似directBuffer,待验证。