Java语言中的四种引用区别

  介绍

本篇内容介绍了“Java语言中的四种引用区别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

四种引用的区别

其实四种引用的区别在于GC的时候,对它们的处理不同。用一句话来概括,就是:如果一个对象GC根可达,强引用不会被回收,软引用在内存不足时会被回收,弱引用在这个对象第一次GC会被回收。

如果GC根不可达,那不论什么引用,都会被回收

虚引用比较特殊,等于没有引用,不会影响对象的生命周期,但可以在对象被收集器回收时收到一个系统通知。

下面结合案例分别来讲一下四种引用在面对GC时的表现以及它们的常见用途。先设置一下JVM的参数:

 <代码> -Xms20M -Xmx20M -Xmn10M - verbose: GC - xx: + PrintGCDetails 

强引用

这就是我们平时最常使用的引用。只要GC的时候这个对象GC根可达,它就不会被回收。如果JVM内存不够了,直接抛出伯父。比如下面这段代码就会抛出OutOfMemoryError:

 <代码>公共静态void main (String [] args) {
,,List   列表=新的LinkedList<在();
,for (int i=0;我& lt;   21;我+ +){
,,,列表。(新添加字节(1024 *   1024]);
,,}
}

软引用

软引用,当GC的时候,如果GC根可达,如果内存足够,就不会被回收,如果内存不够用,会被回收。将上面的例子改成软引用,就不会被伯父:

 <代码>公共静态void main (String [] args) {
,,List列表=新的LinkedList<在();
,for (int i=0;我& lt;   21;我+ +){
,,,,SoftReference,,,,list.add (softReference);
,,}
}

我们把程序改造一下,打印出GC后的前后的差别:

 <代码>公共静态void main (String [] args) {
,,List,for (int i=0;我& lt;   21;我+ +){
,,,,SoftReference,,,,list.add (softReference);
,,,,System.out.println (“gc前:“+ softReference.get ());
,}
大敌;,system . gc ();
,,(SoftReference,,,,System.out.println (“gc后:“+ softReference.get ());
,,}
}

会发现,打印出的日志,GC前都是有值的,而GC后,会有一些是null,代表它们已经被回收。

而我们设置的堆最大为20 m,如果把循环次数改成15日就会发现打印出的日志,GC后没有为零的。但通过- verbose: GC - xx: + PrintGCDetails参数能发现,JVM还是进行了几次GC的,只是由于内存还够用,所以没有回收。

 <代码>公共静态void main (String [] args) {
,,List,for (int i=0;我& lt;   15;我+ +){
,,,,SoftReference,,,,list.add (softReference);
,,,,System.out.println (“gc前:“+ softReference.get ());
,}
大敌;,system . gc ();
,,(SoftReference,,,,System.out.println (“gc后:“+ softReference.get ());
,,}
}

所以软引用的常见用途就呼之欲出了:缓存。尤其是那种希望这个缓存能够持续时间长一点的。

弱引用

软引用,只要这个对象发生GC,就会被回收。

把上面的代码改成软引用,会发现打印出的日志,GC后全部为null。

 <代码>公共静态void main (String [] args) {
,,List,for (int i=0;我& lt;   15;我+ +){
,,,,WeakReference,,,,list.add (weakReference);
,,,,System.out.println (“gc前:“调用weakreference . get () +);
,}
大敌;,system . gc ();
,,(WeakReference,,,,System.out.println (“gc后:“调用weakreference . get () +);
,,}
}

所以弱引用也适合用来做缓存,不过由于它是只要发生GC就会被回收,所以存活的时间比软引用短得多,通常用于做一些非常临时的缓存。

我们知道,WeakHashMap内部是通过弱引用来管理条目的。它的键是“弱键”,所以在GC时,它对应的键值对也会从地图中删除。

Tomcat中有一个ConcurrentCache,用到了WeakHashMap,结合ConcurrentHashMap,实现了一个线程安全的缓存,感兴趣的同学可以研究一下源码,代码非常精简,加上所有注释,只有短短59行。

Java语言中的四种引用区别

Copyright © 2020-2023 feiqueyun.cn. All Rights Reserved. 肥雀云_南京肥雀信息技术有限公司版权所有 南京肥雀信息技术有限公司 苏ICP备16063723号-5