首页
随机
最近更改
特殊页面
社群首页
参数设置
关于WHY42
免责声明
WHY42
搜索
用户菜单
登录
欢迎来到Riguz的小站!这是一个私人wiki,用来记录一些我的笔记。
查看“︁Java:References”︁的源代码
←
Java:References
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
=Java引用类型= == Strong References== 默认的引用方式,即通过<syntaxhighlight lang="java" inline>MyClass obj = new MyClass (); </syntaxhighlight>这种方式赋值的对象,如果其存在active引用(从GC Root reachable)的话,是不会被回收的。如果内存不够,会抛出OOM异常。 ==Weak References== 如果一个对象只能被弱引用访问(不存在强引用或者软引用的情况),那么下一次GC将被清理掉。 其主要的使用场景是实现<span class="article-label">canonicalizing mappings</span>。即对于一个特定的value,map中只有一个instance。 === WeakHashMap=== <span class="article-label">WeakHashMap</span>的key是使用的<span class="article-label">WeakReference</span>,当某个key不再被使用的时候整个entry会被GC掉。这种设计里面的key主要面向的是按引用比较的对象,即<span class="article-label">equals</span>里面按照<span class="article-label">==</span>操作符进行比较(object identity)。WeakHashMap对于按值比较的对象,例如<span class="article-label">String</span>,使用起来完全没有问题,但是因为String是可以recreate的,因此有时候会比较confusing。 <span class="article-label">WeakHashMap</span> may behave as though an unknown thread is silently removing entries. 因为其中的value是强引用,使用的时候应该避免value中又去引用key的情况,否则会导致这个entry无法被回收。 典型使用WeakHashMap的场景是caching或者存储类的元数据。 ==Soft References== 软引用的对象在JVM内存不足的时候会被回收掉。 ==Phantom References== ===作用=== <span class="article-label">PhantomReference</span>(虚引用) 无法直接获取被引用的对象,必须跟<span class="article-label">ReferenceQueue</span>一起使用。<span class="article-label">PhantomReference</span>最弱,发生GC时会被回收,当JVM执行完<syntaxhighlight lang="java" inline>finalize</syntaxhighlight>之后,对象会被放到<span class="article-label">ReferenceQueue</span>中。 <syntaxhighlight lang="java"> Gfg g = new Gfg(); ReferenceQueue<Gfg> refQueue = new ReferenceQueue<>(); PhantomReference<Gfg> phantomRef = new PhantomReference<>(g, refQueue); // 当g(强引用)不继续存在之后,对象就会被可以回收了 // 但在对象 g = null; //It always returns null. g = phantomRef.get(); </syntaxhighlight> === 使用场景 === 其使用场景主要有两种: * 检测对象何时被回收,例如在执行对内存敏感的任务的时候,等待大对象回收了再开始新的任务 * 避免直接执行<span class="article-label">finalize</span>, <syntaxhighlight lang="java" inline>Object.finalize()</syntaxhighlight>在Java9中被标为<span class="article-label">Deprecated</span>了,The <span class="article-label">Cleaner</span> and <span class="article-label">PhantomReference</span> provide more flexible and efficient ways to release resources when an object becomes unreachable. 直接执行finalize有什么问题呢? <q> Finalization can lead to performance issues, deadlocks, and hangs. Errors in finalizers can lead to resource leaks; there is no way to cancel finalization if it is no longer necessary; and no ordering is specified among calls to finalize methods of different objects. </q> [[Category:Programe]]
返回
Java:References
。