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