|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
专门做了这个例子;而java的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。
StrongReference、SoftReference、WeakReference、PhantomReferenceJava援用总结--StrongReference、SoftReference、WeakReference、PhantomReference
1Java援用先容
Java从1.2版本入手下手引进了4种援用,这4种援用的级别由高到低顺次为:
强援用>软援用>弱援用>虚援用
⑴强援用(StrongReference)
强援用是利用最广泛的援用。假如一个对象具有强援用,那渣滓接纳器毫不会接纳它。当内存空间不敷,Java假造机宁肯抛出OutOfMemoryError毛病,使程序非常停止,也不会靠随便接纳具有强援用的对象来办理内存不敷的成绩。
⑵软援用(SoftReference)
假如一个对象只具有软援用,则内存空间充足,渣滓接纳器就不会接纳它;假如内存空间不敷了,就会接纳这些对象的内存。只需渣滓接纳器没有接纳它,该对象就能够被程序利用。软援用可用来完成内存敏感的高速缓存。
软援用能够和一个援用行列(ReferenceQueue)团结利用,假如软援用所援用的对象被渣滓接纳器接纳,Java假造机就会把这个软援用到场到与之联系关系的援用行列中。
⑶弱援用(WeakReference)
弱援用与软援用的区分在于:只具有弱援用的对象具有更长久的性命周期。在渣滓接纳器线程扫描它所统领的内存地区的过程当中,一旦发明了只具有弱援用的对象,不论以后内存空间充足与否,城市接纳它的内存。不外,因为渣滓接纳器是一个优先级很低的线程,因而纷歧定会很快发明那些只具有弱援用的对象。
弱援用能够和一个援用行列(ReferenceQueue)团结利用,假如弱援用所援用的对象被渣滓接纳,Java假造机就会把这个弱援用到场到与之联系关系的援用行列中。
⑷虚援用(PhantomReference)
“虚援用”望文生义,就是形同虚设,与其他几种援用都分歧,虚援用其实不会决意对象的性命周期。假如一个对象仅持有虚援用,那末它就和没有任何援用一样,在任什么时候候都大概被渣滓接纳器接纳。
虚援用次要用来跟踪对象被渣滓接纳器接纳的举动。虚援用与软援用和弱援用的一个区分在于:虚援用必需和援用行列(ReferenceQueue)团结利用。当渣滓接纳器筹办接纳一个对象时,假如发明它另有虚援用,就会在接纳对象的内存之前,把这个虚援用到场到与之联系关系的援用行列中。
因为援用和内存接纳干系严密。上面,先经由过程实例对内存接纳有个熟悉;然后,进一步经由过程援用实例加深对援用的懂得。
2内存接纳
创立大众类MyDate,它的感化是掩盖finalize()函数:在finalize()中输入打印信息,便利追踪。
申明:finalize()函数是在JVM接纳内存时实行的,但JVM其实不包管在接纳内存时必定会挪用finalize()。
MyDate代码以下:- packagecom.skywang.java;
- importjava.util.Date;
- publicclassMyDateextendsDate{
- /**CreatesanewinstanceofMyDate*/
- publicMyDate(){
- }
- //掩盖finalize()办法
- protectedvoidfinalize()throwsThrowable{
- super.finalize();
- System.out.println("obj[Date:"+this.getTime()+"]isgc");
- }
- publicStringtoString(){
- return"Date:"+this.getTime();
- }
- }
复制代码 在这个类中,对java.util.Date类举行了扩大,偏重写了finalize()和toString()办法。
创立大众类ReferenceTest,它的感化是界说一个办法drainMemory():损耗大批内存,以此来激发JVM接纳内存。
ReferenceTest代码以下:- packagecom.skywang.java;
- publicclassReferenceTest{
- /**CreatesanewinstanceofReferenceTest*/
- publicReferenceTest(){
- }
- //损耗大批内存
- publicstaticvoiddrainMemory(){
- String[]array=newString[1024*10];
- for(inti=0;i<1024*10;i++){
- for(intj=a;j<=z;j++){
- array[i]+=(char)j;
- }
- }
- }
- }
复制代码 在这个类中界说了一个静态办法drainMemory(),此办法旨在损耗大批的内存,促使JVM运转渣滓接纳。
有了下面两个大众类以后,我们便可测试JVM甚么时分举行渣滓接纳。上面分3种情形举行测试:
情形1:扫除对象
完成代码:- packagecom.skywang.java;
- publicclassNoGarbageRetrieve{
- publicstaticvoidmain(String[]args){
- MyDatedate=newMyDate();
- date=null;
- }
- }
复制代码 运转了局:
<无任何输入>
了局剖析:date固然设为null,但因为JVM没有实行渣滓接纳操纵,MyDate的finalize()办法没有被运转。
情形2:显式挪用渣滓接纳
完成代码:- packagecom.skywang.java;
- publicclassExplicitGarbageRetrieve{
- /**
- *@paramargs
- */
- publicstaticvoidmain(String[]args){
- //TODOAuto-generatedmethodstub
- MyDatedate=newMyDate();
- date=null;
- System.gc();
- }
- }
复制代码 运转了局:
obj[Date:1372137067328]isgc
了局剖析:挪用了System.gc(),使JVM运转渣滓接纳,MyDate的finalize()办法被运转。
情形3:隐式挪用渣滓接纳
完成代码:- packagecom.skywang.java;
- publicclassImplicitGarbageRetrieve{
- /**
- *@paramargs
- */
- publicstaticvoidmain(String[]args){
- //TODOAuto-generatedmethodstub
- MyDatedate=newMyDate();
- date=null;
- ReferenceTest.drainMemory();
- }
- }
复制代码 运转了局:
obj[Date:1372137171965]isgc
了局剖析:固然没有显式挪用渣滓接纳办法System.gc(),可是因为运转了泯灭大批内存的办法,触发JVM举行渣滓接纳。
总结:JVM的渣滓接纳机制,在内存充分的情形下,除非你显式挪用System.gc(),不然它不会举行渣滓接纳;在内存不敷的情形下,渣滓接纳将主动运转
3、Java对援用的分类
3.1强援用
实例代码:- packagecom.skywang.java;
- publicclassStrongReferenceTest{
- publicstaticvoidmain(String[]args){
- MyDatedate=newMyDate();
- System.gc();
- }
- }
复制代码 运转了局:
<p>
Java到底会发战成什么样,让我们拭目以待吧,我始终坚信着java会更好。以上都是俺个人看法,欢迎大家一起交流. |
|