- 浏览: 56835 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
shifulong:
cywhoyi 写道现在用Javassist代理也不错的看了一 ...
java动态代理(jdk &cglib) -
cywhoyi:
现在用Javassist代理也不错的
java动态代理(jdk &cglib)
强引用
Object o = new Object();
o就是一个强引用, 强引用不会被VM GC, 即使内存不够抛出OutOfMemoryError也不会被回收
软引用
/**对象不可达之后,一直到内存不足时,才被回收*/
弱引用
/**对象不可达之后,gc运行就会被回收*/
虚引用
/**还没搞懂,构造的时候必须传一个ReferenceQueue*/
还有WeakHashMap,之后再加上
Reference本身是一个链表的数据结构,有如下两个字段
Reference中 有个 静态的 pending字段
vm会将不可达的Reference对象挂在pending链表上(VM实现);
Reference中还有个 ReferenceHandler 这个handler(Thread[Daemon线程]),
在一个静态快中初始化,
功能就是循环的访问pending,将pending中的不可达对象 入队(enqueue);
Reference & ReferenceQueue的关系:
Reference存在一个ReferenceQueue的引用,Reference存在一个ReferenceQueue的引用是在Reference的构造方法中初始化的,
如果没有指定,会传入一个全局默认的queue但是这个默认的queue,但是这个queue 没有实际的入队操作(见下面源码),
如果传入一个构造的queue,不可达的对象会入队(enqueue)
接下来是WeakHashMap
Object o = new Object();
o就是一个强引用, 强引用不会被VM GC, 即使内存不够抛出OutOfMemoryError也不会被回收
软引用
/**对象不可达之后,一直到内存不足时,才被回收*/
public class SoftReference<T> extends Reference<T> {...}
弱引用
/**对象不可达之后,gc运行就会被回收*/
public class WeakReference<T> extends Reference<T> {...}
虚引用
/**还没搞懂,构造的时候必须传一个ReferenceQueue*/
public class PhantomReference<T> extends Reference<T> { ... public T get() {//但是PhantomReference的get方法,无论何时都返回的是null,这个接下来在看,,,多了怕记不住 return null; } }
还有WeakHashMap,之后再加上
Reference本身是一个链表的数据结构,有如下两个字段
private T referent; Reference next;
Reference中 有个 静态的 pending字段
private static Reference pending = null;
vm会将不可达的Reference对象挂在pending链表上(VM实现);
Reference中还有个 ReferenceHandler 这个handler(Thread[Daemon线程]),
在一个静态快中初始化,
功能就是循环的访问pending,将pending中的不可达对象 入队(enqueue);
Reference & ReferenceQueue的关系:
Reference存在一个ReferenceQueue的引用,Reference存在一个ReferenceQueue的引用是在Reference的构造方法中初始化的,
如果没有指定,会传入一个全局默认的queue但是这个默认的queue,但是这个queue 没有实际的入队操作(见下面源码),
如果传入一个构造的queue,不可达的对象会入队(enqueue)
class ReferenceQueue<T>{ //有两个静态的ReferenceQueue static ReferenceQueue NULL = new Null();//默认的ReferenceQueue static ReferenceQueue ENQUEUED = new Null(); private static class Null extends ReferenceQueue { boolean enqueue(Reference r) {//Null 的enqueue()没有实际的入队操作 return false; } } boolean enqueue(Reference<? extends T> r) { /* Called only by Reference class */ synchronized (r) { if (r.queue == ENQUEUED) return false; synchronized (lock) { r.queue = ENQUEUED; r.next = (head == null) ? r : head; head = r; queueLength++; if (r instanceof FinalReference) { sun.misc.VM.addFinalRefCount(1); } lock.notifyAll(); return true; } } } }
public abstract class Reference<T>{ ... private T referent;//构造函数传入(具体的对象) ReferenceQueue<? super T> queue; /*(网上看来的):pending是由jvm来赋值的, 当Reference内部的referent对象的可达状态改变时, jvm会将Reference对象放入pending链表*/ private static Reference pending = null; /* used by VM */ ... /*守护线程,将注册在queue上, 不可达的referent(pending Reference 链表)放入 queue中*/ private static class ReferenceHandler extends Thread{ ReferenceHandler(ThreadGroup g, String name) { super(g, name); } public void run() { for (;;) {//对pending的访问 ... } } static { //初始化守护线程:ReferenceHandler ThreadGroup tg = Thread.currentThread().getThreadGroup(); for (ThreadGroup tgn = tg; tgn != null; tg = tgn, tgn = tg.getParent()); Thread handler = new ReferenceHandler(tg, "Reference Handler"); /* If there were a special system-only priority greater than * MAX_PRIORITY, it would be used here */ handler.setPriority(Thread.MAX_PRIORITY); handler.setDaemon(true); handler.start(); } /** * Adds this reference object to the queue with which it is registered, * if any.*/ public boolean enqueue() { return this.queue.enqueue(this); } ... }
接下来是WeakHashMap
public class WeakHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V> { .... /*在WeakHashMap则在内部提供了一个非NULL的ReferenceQueue*/ /*WeakHashMap的实现也是通过ReferenceQueue这个“监听器”来实现自动删除那些引用不可达的key的*/ private final ReferenceQueue<Object> queue = new ReferenceQueue<>(); /*内部类,实体,继承WeakReference,重要的是构造方法*/ private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V> { V value; int hash; Entry<K,V> next; Entry(Object key, V value,ReferenceQueue<Object> queue, int hash, Entry<K,V> next) { /*把key放入 WeakReference 的 private T referent; WeakHashMap的key会被回收,但是value却不会被回收, 但是 通过调用 expungeStaleEntries(),value会被回收 源码如下*/ super(key, queue); this.value = value; this.hash = hash; this.next = next; } .... } /*核心的方法*/ private void expungeStaleEntries() { for (Object x; (x = queue.poll()) != null; ) { synchronized (queue) { @SuppressWarnings("unchecked") Entry<K,V> e = (Entry<K,V>) x; int i = indexFor(e.hash, table.length); Entry<K,V> prev = table[i]; Entry<K,V> p = prev; while (p != null) { Entry<K,V> next = p.next; if (p == e) { if (prev == e) table[i] = next; else prev.next = next; // Must not null out e.next; // stale entries may be in use by a HashIterator e.value = null; // Help GC size--; break; } prev = p; p = next; } } } } }
发表评论
-
test
2016-02-26 17:45 434http://c.hiphotos.baidu.com/t ... -
java Integer的比较
2016-01-18 20:09 1037/** * A constant ... -
load过高排查
2016-01-07 19:15 1094jstack 线程的运行情况、线程的状态 load过高的 ... -
Runnable Callable Future FutrueTask ExecutorService的关系
2015-11-30 16:34 664public interface ExecutorSe ... -
单例模式以及序列化仍然单例的问题
2015-11-18 10:47 556这种方式仍然存在并发的同步阻塞问题,并且jdk1.5之 ... -
linux5种网络IO模型
2015-11-07 21:58 862看网上书上的各种解释太绕口难理解了,看到个例子挺好的。 ... -
nio学习记录 : start(buffer channel selector)
2015-11-06 22:17 731Buffer的capacity,limit,positio ... -
desgn partten : 适配器&门面
2015-11-05 11:55 540adapter adapter 一个接口转换成另一个接 ... -
java泛型中的PECS
2015-10-26 17:58 980extends List<? extends Nu ... -
spring自定义cache
2015-10-21 17:14 4515下面是一个较为详细的spring缓存的介绍 http:/ ... -
spring各种接口的作用FactoryBean、ApplicationContextAware、InitializingBean
2015-10-20 20:04 3010FactoryBean 当配置文件中<bean&g ... -
jvm调试命令
2015-10-14 15:42 467jps jps -mlv 列出当前jvm进程 ji ... -
CAS自定义线程安全的计数器
2015-10-10 17:36 2159写了一个线程安全的计数器(用锁显得多没有水平),非阻塞的,通过 ... -
java线程遇见的一个小问题(本质和线程无关都是基础知识)
2015-09-21 10:29 528猜猜下面几个程序,那个是线程安全的 NO1 public cl ... -
JUC--Parser
2015-09-08 16:27 657Java 7的并发包中推出了Phaser,其功能跟Cyclic ... -
JUC--Exchanger
2015-09-07 17:26 862Exchanger 用于线程之间数据交换,通过exchange ... -
java浮点型float遇到的一点问题
2015-04-10 16:32 648float 可以除以0,还可以不是一个数字 即Float.is ... -
java静态块的一个小坑
2015-04-07 18:26 603public class Student { pr ... -
java学习计划
2015-04-07 17:57 375刚入职的时候,team大神给制定的学习计划。 受益匪浅啊 ... -
购物网站(spring+mybatis+velocity+maven)项目
2015-04-03 18:06 957原文地址: http://www.iteye.com/top ...
相关推荐
主要介绍了详解Java对象的强、软、弱和虚引用+ReferenceQueue的相关资料,需要的朋友可以参考下
不知道大家知不知道特殊的reference对象都是被jvm专门处理的,所以这篇文章就相应的工作流程和referencequeue之间的协作进行梳理.有需要的朋友们可以参考借鉴。
NULL 博文链接:https://hoochiang.iteye.com/blog/1889492
ReferenceQueue (done) ArrayDeque (done) Set HashSet (done) TreeSet (done) LinkedHashSet (done) BitSet (done) Map HashMap (done) Hashtable (done) Properties (done) LinkedHashMap (done) IdentityHashMap ...
ReferenceQueue finlize()-- java9已弃用 reflect(反射) 反射实例:ReflectSample.java 实现自己的类加载器:MyClassLoader.java 类加载测试:ClassLoaderCheck.java 显示加载测试:LoadDifference.java ...
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。 如果一个对象只具有弱引用,那么在垃圾回收器线程扫描的过程中...
这是具有弱键的并发,... 如果许多线程同时写入映射,则写入映射可能会导致阻塞(这由ConcurrentHashMap和ReferenceQueue支持的映射暗示),但是,映射的性能明显优于在弱哈希映射周围使用同步包装器。 该库托管在M