不同应用之间的可达性和对于垃圾收集时的影响

强引用就是标记这个对象是活着的,是垃圾回收可以被触碰的,如果这个对象被设置为了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的执行,就可以将对象的特定部分属性,保护了起来,避免了垃圾收集

这样,方便我们在异步编程汇总,保存一些父线程对象

发表评论

邮箱地址不会被公开。 必填项已用*标注