不同应用之间的可达性和对于垃圾收集时的影响
强引用就是标记这个对象是活着的,是垃圾回收可以被触碰的,如果这个对象被设置为了null,就是可以被收集的了
软引用,是一种相对弱化的引用,可以让对象豁免一些垃圾收集,只有OOM大的时候,才会收集软一用
弱引用,就是提供一种可以被访问的状态的引用,不能豁免垃圾收集,就是获取的时候如果能够获取到,就使用,不然就重现实例化
幻象引用,就是虚引用,不能通过这个访问对象,只是有一个再被finalize之后做些事情的机制
基于上述的图进行可达性的讲解
上面的图中
软引用是能被访问到的
弱引也是,不过更临近finalize的时机
幻象引用,就是无法被访问了
最后就是unreachable 不可达状态
对于所有的引用 Reference,都在JDK中提供了get()方法
幻象则是返回null,如果没有销毁,就可以get中获取到,可以利用该机制将其转变可达性状态
而且对于引用,不得不说的是引用对象,在关联相对应的对象的时候,选择使用引用队列,可以利用引用队列获取到引用,进行处理,幻象引用则是一直返回null
软引用在回收前,可能保证一段时间的不被挥手的状态,可以利用
-XX:SoftRefLRUPolicyMSPerMB=3000
设置这个保持时间,但是这是不可控的,在OOM临近的时候,还是会回收,不要妄想使用这个机制来回收
诊断JVM引用状态
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintReferenceGC
获取到垃圾收集日志
以及最后的一个JDK底层提供的强引用的设置方式
如果一个对象没有被指定为强引用,我们还想要说明他不可被回收的话
可以使用reachability fence
action的执行,就可以将对象的特定部分属性,保护了起来,避免了垃圾收集
这样,方便我们在异步编程汇总,保存一些父线程对象