ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

java.lang.finalizer Java的finalizer是个坑?垃圾回收器都哭了

java.lang.finalizer Java的finalizer是个坑?垃圾回收器都哭了 简要介绍, 此文本着重研讨了java.lang.ref这个包的运用方式, 以及对其中源码的解析。并且针对该包在不同的JVM之上的所呈现的表现开展了对比以及剖析。借由阅读这一篇文章, 读者能够深化对于java.lang.ref的认知, 进而在进行开发期间能够更妥善地运用这个包。概述Java.lang.ref是Java类库里较为特殊的一个包, 它给出了和Java垃圾回收器紧密相关的引用类, 这些引用类对象能够指向别的对象, 然而它们有别于一般的引用, 这是由于它们的存有并不阻碍Java垃圾回收器去回收它们所指向的对象, 其优点就在于能够让使用者持有对使用对象的引用, 与此同时JVM依然能够在内存不够之时对使用对象进行回收, 所以这个包在用于达成与缓存有关的应用之际格外有用。与此同时, 这个包还给出了当对象的“可达”性出现变化的时候, 用以进行提醒的一种机制。在本文当中, 通过针对这个包展开从浅到深的介绍, 以及进行分析, 从而能够使读者对这个包的理解得以加深, 借着这样的方式, 进而能够更好地借助这个包来实施开发。java.lang.ref 包的介绍我们能够首先去瞧一瞧 java.lang.ref 此包的结构, 就如同于图 1 所呈现的那样。图 1. java.lang.ref 包结构该包中各类的继承关系如图 2 所示图 2. java.lang.ref 包中类的继承关系 :是一个抽象类而 以及 都是继承它的具体类。接下来, 我们进行介绍, 分别介绍强引用呢, 然后开始分析各种虚引用, 这些虚引用是在java.lang.ref包之下的, 接着阐述其特性, 随后说明用法。, , 以及 的特性及用法我们都清楚, JVM里对象是在堆heap上被分配的, 当程序运行中, 不再有引用指向该对象, 那么此对象就能被垃圾回收器回收, 这里提到的引用, 就是我们通常意义上声明的对象类型变量, 像举例的变量类型等, 它区别于原始数据类型变量, 比如int、short、long等, 这种引用也称强引用。于知晓虚引用以前, 我们通常都是借助强引用来针对对象予以引用, 像这样。清单 1. usageString tag new String(T);此处的 tag 引用就称之为强引用。而强引用有以下特征我们即将用以展开讨论的这三种, 相较于强引用来说, 统统都归属为“弱引用”。这意味着当中它们所援引的对象, 只要是在没有强引用予以支撑情况下, 便会依据相应条件, 被 JVM 的垃圾回收器给回收了去。而且, 这些 weak 被采纳回收的具体的时间段, 以及它们现实时所应用执行的办法, 彼此之间的区别还是各不相同挺明显的。紧接着, 现在这会儿分别来针对着逐一展开讨论阐释一下。具体来说, 在“弱引用”范畴内, 它属于可被认定为是最强的那种引用, 这般引用所指向的相应对象, 一旦出现不存在强引用指向它的状况时, 便会在计算机内存里停留一段特定的时间长度, 而垃圾回收器会依据JVM内存的实际使用情形, 也就是内存的紧缺程度如何, 以及该对象它自身的get()方法的调用状况怎样, 来做出是否对其展开回收这般决定, 须知此内容关于在后面的章节当中必会运用几个实验去进行全面阐述。具体运用通常借助, 的构造方式, 把要用弱引用来指向的对象予以包装。在有使用需求之际, 调用, 的get()方法去获取。当对象未遭回收之时, , 的get()方法会返回该对象的强引用。恰似如下这种情况。清单 2. usageSoftReference bean new SoftReference(new Bean(name, 10)); System.out.println(bean.get());// “name:10”bean new SoftReference(new Bean(name, 10)); System.out.println(bean.get());// “name:10”软引用有以下特征当垃圾回收器判定并预备着手对其予以回收之时, 会先行予以清空处理, 这也就意味着, 此时该对象中的get()方法回馈返归的将会是null紧随其后便会调用该对象的()方法 , 依照流程安排随后在下一轮的垃圾回收进程中对其实施实则意义上的回收操作。作为一种引用类型, 它是弱于其他的。弱引用的特性大体上跟基本软引用相类似, 其不同点在于, 对于弱引用所指向的对象而言, 只要开启系统垃圾回收, 无论内存处在何种使用情形, 总是会对该对象予以回收处理调用 get() 方法时返回 null 值。完全可以通过和 一样的方式来操作 这里就不再复述。弱引用有以下特征乃是所有“弱引用”里头最弱的那种引用类型, 跟软引用以及弱引用不一样, 虚引用没办法借助 get() 方法去获取目标对象的强引用进而使用目标对象, 查看源码能够发觉 get() 被重写为始终返回 null。则虚引用究竟存有怎样的作用呢? 实际上, 虚引用主要是用以跟踪对象被垃圾回收的状态这一状况的, 借助查看引用队列里是否涵盖了对象所相应的虚引用来判定它是否即将面临被垃圾回收的情况, 进而据此采取行动。它并非被期望用于获取目标对象的引用这一行为, 然而在目标对象被回收之前, 它的引用会被放置于一个对象之中, 进而达成跟踪对象垃圾回收的作用。故而具体的使用方法跟先前的那两个存在差异, 它得传入一个对象, 当虚引用所指向的对象被进行垃圾回收操作之后, 虚引用会被增添到这个队列里, 像这样:清单 3. usagepublic static void main(String[] args) { ReferenceQueue refQueue new ReferenceQueue(); PhantomReference referent new PhantomReference( new String(T), refQueue); System.out.println(referent.get());// null System.gc(); System.runFinalization(); System.out.println(refQueue.poll() referent); //true }refQueue new ReferenceQueue(); PhantomReference referent new PhantomReference( new String(T), refQueue); System.out.println(referent.get());// null System.gc(); System.runFinalization(); System.out.println(refQueue.poll() referent); //true }需要留意的是, 在引用回收这一方面, 虚引用并不是象强引用那般会依据内存状况自动将目标对象回收, 相反, 得由自己去对其加以处理, 用以防止Heap内存不足而引发异常。虚引用有以下特征此外需要留意的是, 实际上, 还有的构造函数能够接纳一个对象。在及被清空之际也就是 Java 垃圾回收器打算对它们所指向的对象予以回收之时, 于调用对象的()方法之前, 它们自身会被纳入到这个对象里, 此刻能够借助的 poll()方法获取到它们。而仅仅在 Java 垃圾回收器对其所指向的对象切实进行回收时, 才会把它加入到这个对象中, 如此便能够追踪对象的销毁情形。各种引用类型总结下表对于各种引用类型的特征进行了小结表 1. 引用类型特性总结引用类型取得目标对象方式垃圾回收条件是否可能内存泄漏强引用直接调用不回收可能软引用通过 get() 方法视内存情况回收不可能弱引用通过 get() 方法永远回收不可能虚引用无法取得不回收可能注意在想要运用这些相对而言较强的引用, 以此来针对较弱的引用开展对象操作之际, 那就一定要确保不存在任何强引用指向那个被操作的对象。不然的话, 将会被视作强引用指向了该对象, 届时便不会具备任何属于弱引用的特性。下一章我们将做 2 个实验来佐证上面这些总结的内容。, , 以及 的各种特性实验分析为了能更出色地描绘它们的特性, 先是采用表格予以归纳, 之后又使用示例程序进行说明。图 3. 设置 JVM 运行环境初始值接下来就开始我们的实验。表 2各个引用在 GC 后是否被回收类型GC 后是否回收示例代码运行结果不回收见清单 3name:10不回收见清单 4name:10回收见清单 5name:10N/AN/AN/A清单 4public static void main(String[] args) { Bean bean new Bean(name, 10); System.gc(); System.runFinalization(); System.out.println(bean);// “name:10” }给你总结一下: 那种具有强引用特性所针对指向的那般对象, 在无论如何的任何时候, 一定绝对是都不会遭到被系统回收这件事儿的。清单 5public static void main(String[] args) { SoftReference bean new SoftReference(new Bean(name, 10)); System.gc(); System.runFinalization(); System.out.println(bean.get());// “name:10” }bean new SoftReference(new Bean(name, 10)); System.gc(); System.runFinalization(); System.out.println(bean.get());// “name:10” }汇总得出: 软引用导向的对象会依据内存运用情形去判定是否进行回收, 在此, 内存尚比较充裕, 因而不会遭到回收。清单 6public static void main(String[] args) { WeakReference bean new WeakReference(new Bean(name, 10)); System.gc(); System.runFinalization(); System.out.println(bean.get());// “null” }bean new WeakReference(new Bean(name, 10)); System.gc(); System.runFinalization(); System.out.println(bean.get());// “null” }归纳得出: 只要针对弱引用所指向的对象开展 GC, 那么该对象就会自行被回收, 并且 get() 会返回 null。表3, 各个引用, 在创建大量对象之际, 是否会致使Heap不足异常出现呢?类型是否抛出异常示例代码运行结果抛出异常见清单 6在“主程序”中, Java语言的运行环境里, 出现了Java堆空间不足的情况。不抛异常之前的引用自动清空并返回 null见清单 7null同上见清单 8null抛出异常见清单 9in main java.lang.: Java heap space清单 7public static void main(String[] args) { Bean[] referent new Bean[100000]; for (int i0;ipublic static void main(String[] args) { Bean[] referent new Bean[100000]; for (int i0;i要点概括: 于新开辟的某个 Bean 对象之际, 既然强引用始终不会被系统予以回收, 那么当最大 Heap 阈值抵达 2m 的时候, 系统便会报出 Heap 不足的异常情况。清单 8public static void main(String[] args) { Reference[] referent new SoftReference[100000]; for (int i0;i(new Bean(mybean: i,100)); } System.out.println(referent[100].get());// “null” }public static void main(String[] args) { Reference[] referent new SoftReference[100000]; for (int i0;i(new Bean(mybean: i,100)); } System.out.println(referent[100].get());// “null” }总结: 在新开辟一个Bean对象的时候, 因为软引用会依据内存使用情形来判定是否自动回收, 所以当最大Heap阈值抵达2m地的时候, 系统自动回收最先开辟的对象, 取第100个对象时, 返回为null。清单 9public static void main(String[] args) { Reference[] referent new WeakReference[100000]; for (int i0;i(new Bean(mybean: i,100)); } System.out.println(referent[100].get());// “null” }[] referent new WeakReference[100000]; for (int i0;i(new Bean(mybean: i,100)); } System.out.println(referent[100].get());// “null” }概括得出: 和有着一样的特性, 同样会依据内存使用状况来判别是不是自动回收。获取第一百个对象之际, 返回的是null。清单 10public static void main(String[] args) { Reference[] referent new PhantomReference[100000]; ReferenceQueue queue new ReferenceQueue(); for (int i0;i(new Bean(mybean: i,100), queue);// throw Exception } System.out.println(referent[100].get()); }[] referent new PhantomReference[100000]; ReferenceQueue queue new ReferenceQueue(); for (int i0;i(new Bean(mybean: i,100), queue);// throw Exception } System.out.println(referent[100].get()); }总结: 它跟那种强引用颇为相似, 这种情况下它不会靠着对内存状况的自动判断而为目标对象进行自动回收操作, 所以在这儿呢, Heap当中就会持续不断地去开辟全新的空间, 等到这个空间大小把那个2m的阈值达到之际, 系统会向外部报出一种异常情况。以及鉴于作为处在java.lang.ref里头的那般不可以被公开予以访问的一类, 它所起到的是怎样的一种作用, 作为其的子类, 在垃圾回收机制当中又充当了怎样的一个角色?事实上, 恰恰所代表的便是 Java 里的强引用, 像这般的代码。Bean bean new Bean();在虚拟机的实现进程里, 实际运用了类对其予以引用。并且, 除了身为一个实现类之外, 更是于虚拟机之中实现一个, 使得虚拟机能够在所有的强引用被解除以后达成内存清理。让我们瞧一瞧, 究竟是怎样开展工作的。首先呢, 借助声明, 随后把该线程进行实例化, 在设为守护线程之后, 再加入到系统线程里面去。清单 11static { ThreadGroup tg Thread.currentThread().getThreadGroup(); for (ThreadGroup tgn tg; tgn ! null; tg tgn, tgn tg.getParent()); Thread finalizer new FinalizerThread(tg); finalizer.setPriority(Thread.MAX_PRIORITY - 2); finalizer.setDaemon(true); finalizer.start(); }在垃圾回收的进程当中, 处于一种状况下就是, 当存在一个强引用那种被释放了的情况时, 经过系统垃圾收集器予以标记以后的对象, 会被添加进对象里的某个地方那里去, 并且会调用一个带有括号的什么东西来执行对象那种的某个什么样的方法。清单 12private void runFinalizer() { synchronized (this) { if (hasBeenFinalized()) return; remove(); } try { Object finalizee this.get(); if (finalizee ! null !(finalizee instanceof java.lang.Enum)) { invokeFinalizeMethod(finalizee); /*注意这里需要清空栈中包含该变量的的 slot, ** 从而来减少因为一个保守的 GC 实现所造成的变量未被回收的假象 */ finalizee null; } } catch (Throwable x) { } super.clear(); }注意这里需要清空栈中包含该变量的的 slot, ** 从而来减少因为一个保守的 GC 实现所造成的变量未被回收的假象 */ finalizee null; } } catch (Throwable x) { } super.clear(); }留意, 标注之处所运用的 作为 方法, 因 方法于 类里被声明成 这样, 这边必定得采用 方法方可进行调用。接着借着把本地强引用设定为空, 以此让垃圾回收器去清理内存。能够发觉, 借助如此这般的办法, Java对四种引用对象类型, 即软引用 (), 弱引用 (), 强引用 (), 虚引用 () 予以同等看待, 且于垃圾回收器里开展统一的调度以及管理。不同 Java 虚拟机上的表现与分析试让彼此回味一番, 四种引用类型的运行呈现状况, 连同于垃圾回收器开展内存回收清理操作之际的运行呈现情形。标点该用句号吧, 否则语义会模糊。软引用, 其引用类型呈现出这样的情况, 当内存快要接近满负荷之时, 或者对象因.get() 方法的调用在一段时间内未发生后, 垃圾回收器就会去清理该对象, 在运行对象的 方法以前, 会把软引用对象添加到 里面去。弱引用, 此类引用类型表现为, 一旦系统垃圾回收器开始进行回收, 那么就会马上回收该对象的引用, 和软引用相同, 弱引用也会在运行对象的 方法之前, 把弱引用对象添加进去。强引用, 这是最为常用的引用类型, JVM 系统运用 去管理每个强引用对象, 在其被标记要清理时纳入, 并且逐个调用该对象的 () 方法。虚引用, 这可是最虚幻的引用类型, 不管从何处都没办法再度返回被虚引用所引用的对象, 虚引用在系统垃圾回收器开始回收对象之际, 会直接调用 () 方法, 不过不会立刻将其放入回收队列, 只有在真正对象被 GC 清除的时候, 才会把它加入 队列当中去。这里针对较为典型的两个 JVM 环境开展比较这一行为, 这两个环境系 Java SE6 以及 IBM JDK 6 , 采用了如下这般的测试代码。清单 13. 类public class RefTestObj { private int id; public int getId() { return id; } public void setId(int id) { this.id id; } Override public int hashCode() { return super.hashCode(); } Override public String toString() { return super.toString() [id this.id ]; } Override protected void finalize() { System.out.println(Object [ this.hashCode() ][ id this.id ] come into finalize); try { super.finalize(); } catch (Throwable e) { e.printStackTrace(); } } }清单 14. 类import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; public class RefMainThread { public static void main(String[] args) { // 创建三种不同的引用类型所需对象 RefTestObj softRef new RefTestObj(); RefTestObj weakRef new RefTestObj(); RefTestObj phanRef new RefTestObj(); softRef.setId(1); weakRef.setId(2); phanRef.setId(3); ReferenceQueue softRefQueue new ReferenceQueue(); ReferenceQueue weakRefQueue new ReferenceQueue(); ReferenceQueue phanRefQueue new ReferenceQueue(); SoftReference softRefObj new SoftReference(softRef, softRefQueue); WeakReference weakRefObj new WeakReference(weakRef, weakRefQueue); PhantomReference phanRefObj new PhantomReference(phanRef, phanRefQueue); // 打印正常情况下三种对象引用 print(softRefObj); print(weakRefObj); print(phanRefObj); // 将对象清空 softRef null; weakRef null; phanRef null; // 打印引用队列及 get() 方法所能取到的对象自身 if (softRefObj ! null) { System.out.println(Soft Reference Object run get(): softRefObj.get()); System.out.println(Check soft queue: softRefQueue.poll()); } if (weakRefObj ! null) { System.out.println(Weak Reference Object run get(): weakRefObj.get()); System.out.println(Check weak queue: weakRefQueue.poll()); } if (phanRefObj ! null) { System.out.println(Phantom Reference Object run get(): phanRefObj.get()); System.out.println(Check Phantom queue: phanRefQueue.poll()); } // 开始执行垃圾回收 System.gc(); System.runFinalization(); // 检查队列是否已经被加入队列是否还能取回对象 if (softRefObj ! null) { System.out.println(Soft Reference Object run get(): softRefObj.get()); System.out.println(Check soft queue: softRefQueue.poll()); } if (weakRefObj ! null) { System.out.println(Weak Reference Object run get(): weakRefObj.get()); System.out.println(Check weak queue: weakRefQueue.poll()); } if (phanRefObj ! null) { System.out.println(Phantom Reference Object run get(): phanRefObj.get()); System.out.println(Check Phantom queue: phanRefQueue.poll()); } // 对于虚引用对象在经过多次 GC 之后 才会加入到队列中去 Reference mynewphan null; int refCount 1; while (mynewphan null) { mynewphan phanRefQueue.poll(); System.gc(); System.runFinalization(); if (mynewphan ! null) { System.out.println(Check Phantom queue: mynewphan); System.out.println(Count for refCount times); break; } refCount ; } } public static void print(Reference ref) { RefTestObj obj ref.get(); System.out.println(The Reference is ref.toString() and with object obj which is (obj null ? null : not null)); } }softRefQueue new ReferenceQueue(); ReferenceQueue weakRefQueue new ReferenceQueue(); ReferenceQueue phanRefQueue new ReferenceQueue(); SoftReference softRefObj new SoftReference(softRef, softRefQueue); WeakReference weakRefObj new WeakReference(weakRef, weakRefQueue); PhantomReference phanRefObj new PhantomReference(phanRef, phanRefQueue); // 打印正常情况下三种对象引用 print(softRefObj); print(weakRefObj); print(phanRefObj); // 将对象清空 softRef null; weakRef null; phanRef null; // 打印引用队列及 get() 方法所能取到的对象自身 if (softRefObj ! null) { System.out.println(Soft Reference Object run get(): softRefObj.get()); System.out.println(Check soft queue: softRefQueue.poll()); } if (weakRefObj ! null) { System.out.println(Weak Reference Object run get(): weakRefObj.get()); System.out.println(Check weak queue: weakRefQueue.poll()); } if (phanRefObj ! null) { System.out.println(Phantom Reference Object run get(): phanRefObj.get()); System.out.println(Check Phantom queue: phanRefQueue.poll()); } // 开始执行垃圾回收 System.gc(); System.runFinalization(); // 检查队列是否已经被加入队列是否还能取回对象 if (softRefObj ! null) { System.out.println(Soft Reference Object run get(): softRefObj.get()); System.out.println(Check soft queue: softRefQueue.poll()); } if (weakRefObj ! null) { System.out.println(Weak Reference Object run get(): weakRefObj.get()); System.out.println(Check weak queue: weakRefQueue.poll()); } if (phanRefObj ! null) { System.out.println(Phantom Reference Object run get(): phanRefObj.get()); System.out.println(Check Phantom queue: phanRefQueue.poll()); } // 对于虚引用对象在经过多次 GC 之后 才会加入到队列中去 Reference mynewphan null; int refCount 1; while (mynewphan null) { mynewphan phanRefQueue.poll(); System.gc(); System.runFinalization(); if (mynewphan ! null) { System.out.println(Check Phantom queue: mynewphan); System.out.println(Count for refCount times); break; } refCount ; } } public static void print(Reference ref) { RefTestObj obj ref.get(); System.out.println(The Reference is ref.toString() and with object obj which is (obj null ? null : not null)); } }按照执行, 我们能够清楚地依据打印获得的结果, 看到对象于内存里被放进队列, 还有调用方法的那个顺序以及过程。为了测试不一样的 JVM 环境, 并且消除其他因素所带来的影响, 在本例当中所采用的背景环境, 全部都是处于特定情况下的 32bit JVM。首先, 采用了环境, 此环境是Java SE 6 版本号为23 的环境来进行测试, 而后, 结果呈现如下 :。清单 15. Java SE 6 23 下测试结果The Reference is java.lang.ref.SoftReferencec17164 and with object RefTestObj1fb8ee3[id1] which is not null The Reference is java.lang.ref.WeakReference61de33 and with object RefTestObj14318bb[id2] which is not null The Reference is java.lang.ref.PhantomReferenceca0b6 and with object null which is null Soft Reference Object run get():RefTestObj1fb8ee3[id1] Check soft queue:null Weak Reference Object run get():RefTestObj14318bb[id2] Check weak queue:null Phantom Reference Object run get():null Check Phantom queue:null Object [27744459][id3] come into finalize Object [21174459][id2] come into finalize Soft Reference Object run get():RefTestObj1fb8ee3[id1] Check soft queue:null Weak Reference Object run get():null Check weak queue:java.lang.ref.WeakReference61de33 Phantom Reference Object run get():null Check Phantom queue:null Check Phantom queue:java.lang.ref.PhantomReferenceca0b6 Count for 2 times能够看见, 在运行了系统回收之后, 虚引用跟弱引用被回收掉, 鉴于内存并非处于紧张状态, 软引用依旧维持原状。弱引用马上被添加到了队列之中, 然而虚引用却是在循环两次的手动调用GC之后才被添加到队列里。其次, 所采用的环境是IBM JDK 6, 结果如下:。清单 16. IBM JDK 6 下测试结果The Reference is java.lang.ref.SoftReference3a2c3a2c and with object RefTestObj391e391e[id1] which is not null The Reference is java.lang.ref.WeakReference3a303a30 and with object RefTestObj39203920[id2] which is not null The Reference is java.lang.ref.PhantomReference3a353a35 and with object null which is null Soft Reference Object run get():RefTestObj391e391e[id1] Check soft queue:null Weak Reference Object run get():RefTestObj39203920[id2] Check weak queue:null Phantom Reference Object run get():null Check Phantom queue:null Object [958544162][id3] come into finalize Object [958413088][id2] come into finalize Soft Reference Object run get():RefTestObj391e391e[id1] Check soft queue:null Weak Reference Object run get():null Check weak queue:java.lang.ref.WeakReference3a303a30 Phantom Reference Object run get():null Check Phantom queue:null Object [958282014][id1] come into finalize ............程序运行至此处, 进入了无限循环, 必须手动予以终止。将上下两份结果进行比对, 能够看到, 当多次运行系统垃圾回收之后, IBM JVM把软引用一同加入到了回收队列里, 并且运行了其方法。此外, 即便经过诸多系统垃圾回收, 虚引用也未被加入到队列之中。不清楚这是不是IBM JVM的一个细小的BUG之处。小结这里深入地对java.lang.ref包使用方法予以介绍, 并且通过结合实验来分析包内不同类的表现, 同时还对该包于不同Java虚拟机上的表现展开深入地分析。Csdn.duck.inK/POST/xjdUe9.DocCsdn.duck.inK/POST/LvXQFB.DocCsdn.duck.inK/POST/X1xswm.DocCsdn.duck.inK/POST/8Jzw75.DocCsdn.duck.inK/POST/VGbf6s.DocCsdn.duck.inK/POST/SrxcY7.DocCsdn.duck.inK/POST/IjvrzB.DocCsdn.duck.inK/POST/EiJ2OH.DocCsdn.duck.inK/POST/uCg5yA.DocCsdn.duck.inK/POST/Ee1wFJ.DocCsdn.duck.inK/POST/2q5EXe.DocCsdn.duck.inK/POST/6EtDYN.DocCsdn.duck.inK/POST/xLegDb.DocCsdn.duck.inK/POST/jJCD8b.DocCsdn.duck.inK/POST/6Mi6I0.DocCsdn.duck.inK/POST/MICeYk.DocCsdn.duck.inK/POST/W67DQO.DocCsdn.duck.inK/POST/UbKFfI.DocCsdn.duck.inK/POST/mIfDG0.DocCsdn.duck.inK/POST/f5xvIh.DocCsdn.duck.inK/POST/3x6Hnq.DocCsdn.duck.inK/POST/0CKyb1.DocCsdn.duck.inK/POST/szNx0K.DocCsdn.duck.inK/POST/tGCJyy.DocCsdn.duck.inK/POST/otvYNW.DocCsdn.duck.inK/POST/i7f6vo.DocCsdn.duck.inK/POST/3rAZDV.DocCsdn.duck.inK/POST/INdYpH.DocCsdn.duck.inK/POST/19L9rm.DocCsdn.duck.inK/POST/Whusc6.DocCsdn.duck.inK/POST/b7CQ7A.DocCsdn.duck.inK/POST/UMfL2Q.DocCsdn.duck.inK/POST/4SIuns.DocCsdn.duck.inK/POST/2hzcqb.DocCsdn.duck.inK/POST/PwDjbU.DocCsdn.duck.inK/POST/a9oZRR.DocCsdn.duck.inK/POST/mjHHBs.DocCsdn.duck.inK/POST/I2Q2OR.DocCsdn.duck.inK/POST/hYUNDC.DocCsdn.duck.inK/POST/27QEKL.DocCsdn.duck.inK/POST/U88d3L.DocCsdn.duck.inK/POST/Y0Y8yd.DocCsdn.duck.inK/POST/6WwjDC.DocCsdn.duck.inK/POST/C4tix4.DocCsdn.duck.inK/POST/kv3G5j.DocCsdn.duck.inK/POST/WnBhYf.DocCsdn.duck.inK/POST/wrQFzZ.DocCsdn.duck.inK/POST/JEf0gC.DocCsdn.duck.inK/POST/L25GrY.DocCsdn.duck.inK/POST/dcFx3x.DocCsdn.duck.inK/POST/FEVhqr.DocCsdn.duck.inK/POST/AQsxBy.DocCsdn.duck.inK/POST/GaDdtU.DocCsdn.duck.inK/POST/DjDlo8.DocCsdn.duck.inK/POST/cKNvPm.DocCsdn.duck.inK/POST/oEsgaw.DocCsdn.duck.inK/POST/3WFpnA.DocCsdn.duck.inK/POST/mPLr4M.DocCsdn.duck.inK/POST/bvhHFQ.DocCsdn.duck.inK/POST/B3eOr3.DocCsdn.duck.inK/POST/DsC548.DocCsdn.duck.inK/POST/fVjo0R.DocCsdn.duck.inK/POST/08lNxv.DocCsdn.duck.inK/POST/3MPUwk.DocCsdn.duck.inK/POST/KUqoz6.DocCsdn.duck.inK/POST/hxP57U.DocCsdn.duck.inK/POST/6QZi33.DocCsdn.duck.inK/POST/DNwqXq.DocCsdn.duck.inK/POST/aZU2M0.DocCsdn.duck.inK/POST/yrJcW0.DocCsdn.duck.inK/POST/fj3KgO.DocCsdn.duck.inK/POST/oLeS9V.DocCsdn.duck.inK/POST/IMG55h.DocCsdn.duck.inK/POST/YRK64G.DocCsdn.duck.inK/POST/MkmtZO.DocCsdn.duck.inK/POST/47igyS.DocCsdn.duck.inK/POST/E4o9cB.DocCsdn.duck.inK/POST/fir5TW.DocCsdn.duck.inK/POST/UUBiL1.DocCsdn.duck.inK/POST/2iuH9A.DocCsdn.duck.inK/POST/8TyCeR.DocCsdn.duck.inK/POST/DichMF.DocCsdn.duck.inK/POST/PsoETy.DocCsdn.duck.inK/POST/ALCqmn.DocCsdn.duck.inK/POST/PK77Ek.DocCsdn.duck.inK/POST/NN3fHc.DocCsdn.duck.inK/POST/kY0OFp.DocCsdn.duck.inK/POST/UoHDCM.DocCsdn.duck.inK/POST/yrMyH2.DocCsdn.duck.inK/POST/rASGJG.DocCsdn.duck.inK/POST/Og23Lu.DocCsdn.duck.inK/POST/Ol4Edo.DocCsdn.duck.inK/POST/o7g3iF.DocCsdn.duck.inK/POST/Labk1Q.DocCsdn.duck.inK/POST/SPb5Mm.DocCsdn.duck.inK/POST/ggdeWE.DocCsdn.duck.inK/POST/c2piBo.DocCsdn.duck.inK/POST/zd1mxL.DocCsdn.duck.inK/POST/w5LtRx.DocCsdn.duck.inK/POST/AUqtPa.DocCsdn.duck.inK/POST/04NZ04.DocCsdn.duck.inK/POST/Y9E4RP.DocCsdn.duck.inK/POST/Ro0qSM.DocCsdn.duck.inK/POST/QR1pWY.DocCsdn.duck.inK/POST/NRuE2s.DocCsdn.duck.inK/POST/joIu0Q.DocCsdn.duck.inK/POST/2CBXkw.DocCsdn.duck.inK/POST/7FJtJQ.DocCsdn.duck.inK/POST/l8ECwC.DocCsdn.duck.inK/POST/b4JZps.DocCsdn.duck.inK/POST/Y0DdOA.DocCsdn.duck.inK/POST/NXl7zX.DocCsdn.duck.inK/POST/PSDMOD.DocCsdn.duck.inK/POST/afFLH2.DocCsdn.duck.inK/POST/oEV3Af.DocCsdn.duck.inK/POST/WaNsDZ.DocCsdn.duck.inK/POST/VkzuRG.DocCsdn.duck.inK/POST/ImRzcH.DocCsdn.duck.inK/POST/YNczf0.DocCsdn.duck.inK/POST/zWVlxK.DocCsdn.duck.inK/POST/Len3TW.DocCsdn.duck.inK/POST/UzQyni.DocCsdn.duck.inK/POST/M4d5PW.DocCsdn.duck.inK/POST/ukzLon.DocCsdn.duck.inK/POST/I6RyDW.DocCsdn.duck.inK/POST/u1TSbw.DocCsdn.duck.inK/POST/6XHAZq.DocCsdn.duck.inK/POST/F6B414.DocCsdn.duck.inK/POST/Oc3rcW.DocCsdn.duck.inK/POST/t85IaB.DocCsdn.duck.inK/POST/96arhz.DocCsdn.duck.inK/POST/sTawAx.DocCsdn.duck.inK/POST/1z45Ib.DocCsdn.duck.inK/POST/wtmjTB.DocCsdn.duck.inK/POST/3Y9cYT.DocCsdn.duck.inK/POST/4R5nFf.DocCsdn.duck.inK/POST/TiFssw.DocCsdn.duck.inK/POST/fnyGuD.DocCsdn.duck.inK/POST/o6KZba.DocCsdn.duck.inK/POST/NUbqsH.DocCsdn.duck.inK/POST/wAkBFA.DocCsdn.duck.inK/POST/IgnqtJ.DocCsdn.duck.inK/POST/Md1ga7.DocCsdn.duck.inK/POST/kRCUX3.DocCsdn.duck.inK/POST/pi8OsA.DocCsdn.duck.inK/POST/zKRDrB.DocCsdn.duck.inK/POST/yDfnWY.DocCsdn.duck.inK/POST/v0xNDY.DocCsdn.duck.inK/POST/aavqe1.DocCsdn.duck.inK/POST/pM91O6.DocCsdn.duck.inK/POST/3DUQUt.DocCsdn.duck.inK/POST/htoa2o.DocCsdn.duck.inK/POST/WBOKy6.DocCsdn.duck.inK/POST/sY7NgG.DocCsdn.duck.inK/POST/XU0zYe.DocCsdn.duck.inK/POST/XbCAIJ.DocCsdn.duck.inK/POST/c75b9M.DocCsdn.duck.inK/POST/nBCqwG.DocCsdn.duck.inK/POST/9JV722.DocCsdn.duck.inK/POST/BtUQRL.DocCsdn.duck.inK/POST/pQ2MG1.DocCsdn.duck.inK/POST/PYggYu.DocCsdn.duck.inK/POST/q1KA0L.DocCsdn.duck.inK/POST/mD6pRp.DocCsdn.duck.inK/POST/935huy.DocCsdn.duck.inK/POST/TnJGuR.DocCsdn.duck.inK/POST/sWoD4O.DocCsdn.duck.inK/POST/yaaLRw.DocCsdn.duck.inK/POST/NEjzLg.DocCsdn.duck.inK/POST/kPbqSs.DocCsdn.duck.inK/POST/TLzA7i.DocCsdn.duck.inK/POST/k9eKgd.DocCsdn.duck.inK/POST/E6QTfi.DocCsdn.duck.inK/POST/ImKXk0.DocCsdn.duck.inK/POST/awFL4R.DocCsdn.duck.inK/POST/nvX2H0.DocCsdn.duck.inK/POST/261hkt.DocCsdn.duck.inK/POST/Cbs898.DocCsdn.duck.inK/POST/vNVPs1.DocCsdn.duck.inK/POST/cORV6s.DocCsdn.duck.inK/POST/sImjiT.DocCsdn.duck.inK/POST/FDe4Z4.DocCsdn.duck.inK/POST/bcAgJN.DocCsdn.duck.inK/POST/RrJ65U.DocCsdn.duck.inK/POST/DjNE6D.DocCsdn.duck.inK/POST/K8Ywqs.DocCsdn.duck.inK/POST/trmlo5.DocCsdn.duck.inK/POST/0jCmKX.DocCsdn.duck.inK/POST/XarGbm.DocCsdn.duck.inK/POST/vaVShk.DocCsdn.duck.inK/POST/kTrGLq.DocCsdn.duck.inK/POST/VmwglB.DocCsdn.duck.inK/POST/n0vSqE.DocCsdn.duck.inK/POST/sHjMWh.DocCsdn.duck.inK/POST/WyoNjn.DocCsdn.duck.inK/POST/vazEIY.DocCsdn.duck.inK/POST/UIp8H6.DocCsdn.duck.inK/POST/YjORjQ.DocCsdn.duck.inK/POST/OF6qwO.DocCsdn.duck.inK/POST/UutBJN.DocCsdn.duck.inK/POST/0IzsaJ.DocCsdn.duck.inK/POST/CpenoR.DocCsdn.duck.inK/POST/ecrqxD.DocCsdn.duck.inK/POST/8jyUP2.DocCsdn.duck.inK/POST/Y9DOQr.DocCsdn.duck.inK/POST/4DgYwX.DocCsdn.duck.inK/POST/nhqdRq.DocCsdn.duck.inK/POST/dlV2rL.DocCsdn.duck.inK/POST/0aAx8b.DocCsdn.duck.inK/POST/EcaLdw.DocCsdn.duck.inK/POST/YKz0hl.DocCsdn.duck.inK/POST/jibZlm.DocCsdn.duck.inK/POST/hWnzqK.DocCsdn.duck.inK/POST/KfZyQI.DocCsdn.duck.inK/POST/MLvwsi.DocCsdn.duck.inK/POST/eTEHbo.DocCsdn.duck.inK/POST/2M0XdJ.DocCsdn.duck.inK/POST/ieFuWh.DocCsdn.duck.inK/POST/k9KXBN.DocCsdn.duck.inK/POST/cuBEZi.DocCsdn.duck.inK/POST/LXp14K.DocCsdn.duck.inK/POST/gNtA9k.DocCsdn.duck.inK/POST/NbbsMB.DocCsdn.duck.inK/POST/LfEfoV.DocCsdn.duck.inK/POST/2uwkP7.DocCsdn.duck.inK/POST/Shorxw.DocCsdn.duck.inK/POST/RcWP2I.DocCsdn.duck.inK/POST/aMEcAP.DocCsdn.duck.inK/POST/KhwZWE.DocCsdn.duck.inK/POST/PsPhjc.DocCsdn.duck.inK/POST/hM3KoB.DocCsdn.duck.inK/POST/YRn20w.DocCsdn.duck.inK/POST/G79vnU.DocCsdn.duck.inK/POST/UGOzqI.DocCsdn.duck.inK/POST/AgQoCv.DocCsdn.duck.inK/POST/yPnvGl.DocCsdn.duck.inK/POST/Vznolv.DocCsdn.duck.inK/POST/RkFvMD.DocCsdn.duck.inK/POST/0duwYZ.DocCsdn.duck.inK/POST/1sGFbj.DocCsdn.duck.inK/POST/9emfMF.DocCsdn.duck.inK/POST/ishlv1.DocCsdn.duck.inK/POST/OjHj06.DocCsdn.duck.inK/POST/xrmZ3D.DocCsdn.duck.inK/POST/KNmfGe.DocCsdn.duck.inK/POST/EiF1wX.DocCsdn.duck.inK/POST/UBUKBP.DocCsdn.duck.inK/POST/AaPdlY.DocCsdn.duck.inK/POST/pEevvx.DocCsdn.duck.inK/POST/Luw9KQ.DocCsdn.duck.inK/POST/G8HaTL.DocCsdn.duck.inK/POST/LgOAq6.DocCsdn.duck.inK/POST/TTxHtn.DocCsdn.duck.inK/POST/ayxBbv.DocCsdn.duck.inK/POST/wkZVuq.DocCsdn.duck.inK/POST/2DsEw7.DocCsdn.duck.inK/POST/YZSfwt.DocCsdn.duck.inK/POST/jBulYo.DocCsdn.duck.inK/POST/9iKDkT.DocCsdn.duck.inK/POST/iIuhDA.DocCsdn.duck.inK/POST/cuhh3I.DocCsdn.duck.inK/POST/csff8Y.DocCsdn.duck.inK/POST/D2XVOl.DocCsdn.duck.inK/POST/iXkvyT.DocCsdn.duck.inK/POST/J9JKnf.DocCsdn.duck.inK/POST/QPM3cs.DocCsdn.duck.inK/POST/lFUxJG.DocCsdn.duck.inK/POST/EaPcHO.DocCsdn.duck.inK/POST/pkpSpK.DocCsdn.duck.inK/POST/QdKIU9.DocCsdn.duck.inK/POST/oR0RQC.DocCsdn.duck.inK/POST/XtnbNJ.DocCsdn.duck.inK/POST/rwmsL6.DocCsdn.duck.inK/POST/7KEYed.DocCsdn.duck.inK/POST/xxgZvW.DocCsdn.duck.inK/POST/rRNfXK.DocCsdn.duck.inK/POST/4sNgyk.DocCsdn.duck.inK/POST/sVl9Mh.DocCsdn.duck.inK/POST/yHthwQ.DocCsdn.duck.inK/POST/8SCiCM.DocCsdn.duck.inK/POST/6Rbkzz.DocCsdn.duck.inK/POST/nBlQtr.DocCsdn.duck.inK/POST/IQ02FB.DocCsdn.duck.inK/POST/NHcE30.DocCsdn.duck.inK/POST/N2f4Pj.DocCsdn.duck.inK/POST/a1NNbv.DocCsdn.duck.inK/POST/pvC0Oa.DocCsdn.duck.inK/POST/4TepoE.DocCsdn.duck.inK/POST/5NjiRg.DocCsdn.duck.inK/POST/UThDsK.DocCsdn.duck.inK/POST/BY0GBz.DocCsdn.duck.inK/POST/VdOs3a.DocCsdn.duck.inK/POST/RvxTOf.DocCsdn.duck.inK/POST/PDXYra.DocCsdn.duck.inK/POST/2Jrt4X.DocCsdn.duck.inK/POST/Xhryq9.DocCsdn.duck.inK/POST/jP91PD.DocCsdn.duck.inK/POST/rjuP0F.DocCsdn.duck.inK/POST/RY304M.DocCsdn.duck.inK/POST/5SRiAk.DocCsdn.duck.inK/POST/fbzAPZ.DocCsdn.duck.inK/POST/er0fwW.DocCsdn.duck.inK/POST/GphqYF.DocCsdn.duck.inK/POST/AspCbo.DocCsdn.duck.inK/POST/IT9anR.DocCsdn.duck.inK/POST/LUMCOp.DocCsdn.duck.inK/POST/nqZiSI.DocCsdn.duck.inK/POST/kIdNrz.DocCsdn.duck.inK/POST/0WJZDD.DocCsdn.duck.inK/POST/I2dRVV.DocCsdn.duck.inK/POST/YpXC80.DocCsdn.duck.inK/POST/845AeA.DocCsdn.duck.inK/POST/Y3DKVr.DocCsdn.duck.inK/POST/bRWxBI.DocCsdn.duck.inK/POST/WiuXLH.DocCsdn.duck.inK/POST/LMQ12D.DocCsdn.duck.inK/POST/q0erm9.DocCsdn.duck.inK/POST/b6uNDR.DocCsdn.duck.inK/POST/hFkk5B.DocCsdn.duck.inK/POST/kV7f0j.DocCsdn.duck.inK/POST/v3KtZG.DocCsdn.duck.inK/POST/Kd9DHV.DocCsdn.duck.inK/POST/vWYbtN.DocCsdn.duck.inK/POST/vITds5.DocCsdn.duck.inK/POST/2Vh09D.DocCsdn.duck.inK/POST/zSh8BM.DocCsdn.duck.inK/POST/lIoOd8.DocCsdn.duck.inK/POST/2ygj2i.DocCsdn.duck.inK/POST/W7idoY.DocCsdn.duck.inK/POST/ppt6bQ.DocCsdn.duck.inK/POST/wqI3IF.DocCsdn.duck.inK/POST/cfCL3c.DocCsdn.duck.inK/POST/zClsgV.DocCsdn.duck.inK/POST/6ZK4sP.DocCsdn.duck.inK/POST/kZnoQh.DocCsdn.duck.inK/POST/Jt5upK.DocCsdn.duck.inK/POST/NJGjOY.DocCsdn.duck.inK/POST/ef9Hjf.DocCsdn.duck.inK/POST/MS6i4Y.DocCsdn.duck.inK/POST/NI3iGf.DocCsdn.duck.inK/POST/eITBBs.DocCsdn.duck.inK/POST/khfoCk.DocCsdn.duck.inK/POST/kKILXU.DocCsdn.duck.inK/POST/WRHKzz.DocCsdn.duck.inK/POST/SZYsiv.DocCsdn.duck.inK/POST/j966BJ.DocCsdn.duck.inK/POST/QVfkdH.DocCsdn.duck.inK/POST/yRGJGa.DocCsdn.duck.inK/POST/pbD2wO.DocCsdn.duck.inK/POST/egaJqc.DocCsdn.duck.inK/POST/vex7Fq.DocCsdn.duck.inK/POST/JOCBGh.DocCsdn.duck.inK/POST/bfEOws.DocCsdn.duck.inK/POST/8G6ips.DocCsdn.duck.inK/POST/USCHWZ.DocCsdn.duck.inK/POST/ZuJ4Tw.DocCsdn.duck.inK/POST/OUPGd9.DocCsdn.duck.inK/POST/6wKHM7.DocCsdn.duck.inK/POST/xQwzFe.DocCsdn.duck.inK/POST/Q8VFDh.DocCsdn.duck.inK/POST/RGExBJ.DocCsdn.duck.inK/POST/oansV5.DocCsdn.duck.inK/POST/b5L5wV.DocCsdn.duck.inK/POST/r47xoH.DocCsdn.duck.inK/POST/O1ODWk.DocCsdn.duck.inK/POST/6vdFvJ.DocCsdn.duck.inK/POST/5Vaoq1.DocCsdn.duck.inK/POST/u19FJN.DocCsdn.duck.inK/POST/zOeMIo.DocCsdn.duck.inK/POST/mbtkyV.DocCsdn.duck.inK/POST/4h30J2.DocCsdn.duck.inK/POST/nIWOSx.DocCsdn.duck.inK/POST/5XzkI0.DocCsdn.duck.inK/POST/VRIUEu.DocCsdn.duck.inK/POST/1H3aH5.Doc
返回列表