首页 今日头条 正文

木九十,Java的几种引用类型你都了解吗?,平安银行信用卡

一、概述

在Java中供给了四个等级的引证:强引证,软引证,弱引证和虚引证。在这四个引证类型中,只需强引证FinalReference类是包内可见,其他三种引证类型均为public,能够在应冀文平用程序中直接运用。引证类型的类结构如图所示。

二、强引证

Java中的引证,相似C言语中最难的指针。(我是C言语入门编程,指针的概念仍是很深化我心。)经过引证,能够smart准则对堆中的方针进行操木九十,Java的几种引证类型你都了解吗?,安全银行信用卡作。如:

StringBuffer stringBuffer = new StringBuffer("Helloword");

变量str指向StringBuffer实例地点的堆空间,经过str能够操作该方针。

强引证的特色

  1. 强引证能够直接拜访方针方针。
  2. 强引证所指向的方针在任何时候都不会被体系收回。JVM甘愿抛出OOM反常,也不会收回强引证所指向的方针。
  3. 强引证或许导致内存走漏。

三、软引证

软引证是除了强引证外,最强的引证类型。能够经过java.lang.ref.SoftRefer麻衣神相ence运用软引证。一个持有软引证的方针,不会被JVM很快收回,JVM会依据当时堆的运用情况来判别何时收回。当堆运用率接近阈值时,才会去收回软引证的方针。因而,软引证能够用于完成对内存灵敏的高速缓存。

SoftReference的特色是它的一个实例保存对一个Java方针的软引证, 该软引证的存在不阻碍废物搜集线程对该Java方针的收回。也就是说木九十,Java的几种引证类型你都了解吗?,安全银行信用卡,一旦SoftReference保存了对一个Java方针的软引证后,在废物线程对 这个Java方针收回前,SoftReference类所供给的get()办法回来Java方针的强引证。一旦废物线程收回该Java方针之后,get()办法将回来null。

下面举一个比如阐明软引证的运用办法。

在你的IDE设置参数-Xmx2m -Xms2m规则堆内存大小为2m。

@Test

public void test3(){

MyObject obj = new myObject();

SoftReference sf = new SoftReference<>(obj);

obj = null;

System.gc();

// byte[] bytes = new byte[1024*100];

// System.gc();

System.out.println("是否被收回"+sf.get());

}

运转成果:

是否被收回cn.zyzpp.M重型货车yObject@42110406

翻开被注释掉的金在熙new byte[1024*100]句子,这条句子恳求一块大的堆空间,使堆内存运用严重。并显式的再调用一次GC,成果如下:

是否被收回null

阐明在体系内存严重的情况下,软引证被收回。

四、弱引证

弱引证是四喜丸子的做法一种比软引证较弱的引证类型。在体系GC时,只需发现弱引证,不论体系堆空间是否满足,都会将方针进行收回。在java中,能够用java.lang.r医馆笑传ef.WeakReference实例来保存对一个Java方针的弱引证。

public void test3(){

MyObject obj = new MyObject();

WeakReference sf =木九十,Java的几种引证类型你都了解吗?,安全银行信用卡 new WeakReference韩后(obj);

obj = nuljenniel兰亭序全文;

System.out.println("是否被收回"+sf.get());

System.gc();

System.out.println("是否被收回"+sf.get());

}

运转成果:

是否被收回cn.zyzpp.木九十,Java的几种引证类型你都了解吗?,安全银行信用卡MyObject@42110406

是否被收回null

软引证,弱引证都十分合适来保存那些可有可无的缓存数据,假如这么做,当体系内存不足时,这些缓存数据会被收回,不会导致内存溢出。而当内存资源足够时,这些缓存数据又能够存在适当长的时刻,木九十,Java的几种引证类型你都了解吗?,安全银行信用卡然后江山如此多娇起到加快体系的效果。

五、虚引证

虚引证是一切类型中最弱的一个。一个持有虚引证的方针,和没有引证几乎是相同的,随时或许被废物收回器收回女生逼。当企图经过虚引证的get()办法获得强引证时,总是会失利。而且,虚引证有必要和引证行列一同运用,它的效果在于盯梢废物收回进程。

当废物收回器预备收回一个方针时,假如发现它还有虚引证,就会在废物收回后,毁掉这个方针,将这个虚引证参加引证行列。程序能够经过判别引证行列中是否现已参加了虚引证,来了解被引证的方针是否将木九十,Java的几种引证类型你都了解吗?,安全银行信用卡要被废物收回。如初级会计职称果程序发现某个虚引证现已被参加到引证行列,那么就可木九十,Java的几种引证类型你都了解吗?,安全银行信用卡以在所引证的方针的内存被收回之前采纳必要的举动。

public void test3(){

MyObject obj = new MyObject();

ReferenceQueue referenceQueue = new ReferenceQueue<>();

PhantomRefe肛门息肉rence sf = new PhantomReference<>(obj,referenceQueue);

obj = null;

System.LEGOout.println("是否被收回"+sf.get());

System.gc();

System.out.println("是否被收回"+sf.get());

}

运转成果:

是否被收回null

是否被收回null

对虚引证的get()操作,总是回来null,由于sf.get()办法的完成如下:

public T get() {

return null;

}

六、弱引证典例

WeakHashMap类在java.util包内,它完成了Map接口,是HashMap的一种完成,它运用弱引证作为内部数据的存储计划。WeakHashMap是弱引证的一种典型运用,它能够作为简略的缓存表解决计划。

以下两段代码别离运用WeakHashMap和HashMap保存很多的数据:

@Test

public void test4(){

Map map;

map = new WeakHashMap();

for (int i =0;i<10000;i++){

map.put("key"+i,new byte[i]);

}

// map = new HashMap();

// for (int i =0;i<10000;i++){

// map.put("key"+i,new byte[i]);

// }

}

运用-Xmx2M限制堆内存,运用阿q正传Weak年兽的故事HashMap的代码正常运转完毕,而运用HashMap的代码段抛出反常

java.lang.OutOfMemoryError: Java heap space

由此可见,WeakHashM空调移机ap会在体系内存严重时运用弱引证,主动释放掉持有弱引证的内存数据。

但假如WeakHashMa司马光砸缸的故事p的key都在体系内持有强引证,那么WeakHashMap就退化为一般的HashMap,由于一切的表项都无法被主动整理。

相关推荐

  • 暂无相关文章