weak soft Phantom ref

weak soft Phantom ref


常规的就不说了,

说说自己的理解方式

weak soft 相当于是可以将没有friendly strong ref的对象,只有容器(map set arr 等)引用的对象,进行自动回收。 反过来说,weak ref‘s friendly strong ref =null了,它依然可以拿到对象,只要该对象还没有被gc掉

当然 weak 的obj会在 friendly strong ref =null后的第一次 gc里被回收掉(现实情况长一点,后来自己想了下 如果obj已经在old区 minor gc肯定无法回收了,如果是在young区是可以被minor回收的,所以这里的第一次指的是 obj 自己所在的 heap area被之后第一次gc,它才会消失)  ,soft类似只是会在old区空间不够时才会回收,貌似是这样没有细想。

phantom 无法获得实际对象。只是用来 和gc交互知道自己的对象还有没有 strong ref依赖(还是obj有没有gc?不清楚需要确认,个人觉得应该是obj有没有被gc), java nio中用的直接内存c++ native heap(为提高返回挖勺 分配的效率),就是用phantom去决定 free的,传统比较挫的释放native heap是通过 finalize()的full才会调到?,但是如果javaheap足够  不做full gc那就等着被out of 吧



weak soft解决的实际问题

伪代码:

public class Test

map a

method putTmps()

   each i in 1,10

   tmp = new tmp.set(i)

   a.put(tmp)


main

new Test.putTmps


这个过程中 tmp所ref的对象 其实strong引用 只有 map中给它的引用

我希望 tmp一旦 和 内存对象断开联系,就被回收的话,这就可以用 weak or soft ref


再说白了 就是 weak和 strong 1对1 绑定了, 绑定的strong 没了,weak接下去很快也会拿不到 对象,哪怕此时还有 strong1 2 3 n绑定到该对象上去,只要strong没了,gc通过weak知道了 strong没了,接下去就会回收它。就好像有许多同学都可以玩小明的玩具,但是小明扔了玩具,其他所有人都不能再玩了。 例子不好 需要该进。。

测试代码:

import java.lang.ref.WeakReference;
import java.util.HashMap;

public class WeakTest {
    public WeakTest() {
        // TODO Auto-generated constructor stub
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HashMap<Integer, WeakReference> map = new HashMap<Integer,WeakReference>();
        for(int i = 0;i< 10 ;i++){
            Objectx o =new Objectx();
            o.setI(i);
            Integer wri =  new Integer(i);
            WeakReference wro = new WeakReference(o);
            map.put(wri, wro);
            //o =null;
            //System.out.println(((Objectx) map.get(wri).get()).getI());
        }
        
        System.gc();    //More attention to me
        for(int j = 0;j< 100 ;j++){
            for(int i = 0;i< 10 ;i++){
                Integer wri =  new Integer(i);
                if( map.get(wri).get()!=null){
                    System.out.println(((Objectx) map.get(wri).get()).getI());
                }else{
                    System.out.println(wri + " i am null");
                }
                
            }
        }
    }
}

class Objectx{
    private int i = 0;

    public int getI() {
        return i;
    }

    public void setI(int i) {
        this.i = i;
    }
}

 System.gc();  
 存在的话输出

...

0 i am null
1 i am null
2 i am null
3 i am null
4 i am null
5 i am null
6 i am null
7 i am null
8 i am null
9 i am null


//System.gc();

comment掉的话

...

0
1
2
3
4
5
6
7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值