来看对Java援用的总结
专门做了这个例子;而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("objisgc");
}
publicStringtoString(){
return"Date:"+this.getTime();
}
}在这个类中,对java.util.Date类举行了扩大,偏重写了finalize()和toString()办法。
创立大众类ReferenceTest,它的感化是界说一个办法drainMemory():损耗大批内存,以此来激发JVM接纳内存。
ReferenceTest代码以下:
packagecom.skywang.java;
publicclassReferenceTest{
/**CreatesanewinstanceofReferenceTest*/
publicReferenceTest(){
}
//损耗大批内存
publicstaticvoiddrainMemory(){
String[]array=newString;
for(inti=0;i<1024*10;i++){
for(intj=a;j<=z;j++){
array+=(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();
}
}运转了局:
objisgc
了局剖析:挪用了System.gc(),使JVM运转渣滓接纳,MyDate的finalize()办法被运转。
情形3:隐式挪用渣滓接纳
完成代码:
packagecom.skywang.java;
publicclassImplicitGarbageRetrieve{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
MyDatedate=newMyDate();
date=null;
ReferenceTest.drainMemory();
}
}运转了局:
objisgc
了局剖析:固然没有显式挪用渣滓接纳办法System.gc(),可是因为运转了泯灭大批内存的办法,触发JVM举行渣滓接纳。
总结:JVM的渣滓接纳机制,在内存充分的情形下,除非你显式挪用System.gc(),不然它不会举行渣滓接纳;在内存不敷的情形下,渣滓接纳将主动运转
3、Java对援用的分类
3.1强援用
实例代码:
packagecom.skywang.java;
publicclassStrongReferenceTest{
publicstaticvoidmain(String[]args){
MyDatedate=newMyDate();
System.gc();
}
}运转了局:
<p>
Java到底会发战成什么样,让我们拭目以待吧,我始终坚信着java会更好。以上都是俺个人看法,欢迎大家一起交流. Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。 是一种为 Internet发展的计算机语言 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。 一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。 是一种突破用户端机器环境和CPU
页:
[1]