仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 503|回复: 8
打印 上一主题 下一主题

[学习教程] 来看对Java援用的总结

[复制链接]
不帅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:00:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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代码以下:
  1. packagecom.skywang.java;
  2. importjava.util.Date;
  3. publicclassMyDateextendsDate{
  4. /**CreatesanewinstanceofMyDate*/
  5. publicMyDate(){
  6. }
  7. //掩盖finalize()办法
  8. protectedvoidfinalize()throwsThrowable{
  9. super.finalize();
  10. System.out.println("obj[Date:"+this.getTime()+"]isgc");
  11. }
  12. publicStringtoString(){
  13. return"Date:"+this.getTime();
  14. }
  15. }
复制代码
在这个类中,对java.util.Date类举行了扩大,偏重写了finalize()和toString()办法。
创立大众类ReferenceTest,它的感化是界说一个办法drainMemory():损耗大批内存,以此来激发JVM接纳内存。
ReferenceTest代码以下:
  1. packagecom.skywang.java;
  2. publicclassReferenceTest{
  3. /**CreatesanewinstanceofReferenceTest*/
  4. publicReferenceTest(){
  5. }
  6. //损耗大批内存
  7. publicstaticvoiddrainMemory(){
  8. String[]array=newString[1024*10];
  9. for(inti=0;i<1024*10;i++){
  10. for(intj=a;j<=z;j++){
  11. array[i]+=(char)j;
  12. }
  13. }
  14. }
  15. }
复制代码
在这个类中界说了一个静态办法drainMemory(),此办法旨在损耗大批的内存,促使JVM运转渣滓接纳。
有了下面两个大众类以后,我们便可测试JVM甚么时分举行渣滓接纳。上面分3种情形举行测试:
情形1:扫除对象

完成代码:
  1. packagecom.skywang.java;
  2. publicclassNoGarbageRetrieve{
  3. publicstaticvoidmain(String[]args){
  4. MyDatedate=newMyDate();
  5. date=null;
  6. }
  7. }
复制代码
运转了局:
<无任何输入>
了局剖析:date固然设为null,但因为JVM没有实行渣滓接纳操纵,MyDate的finalize()办法没有被运转。
情形2:显式挪用渣滓接纳

完成代码:
  1. packagecom.skywang.java;
  2. publicclassExplicitGarbageRetrieve{
  3. /**
  4. *@paramargs
  5. */
  6. publicstaticvoidmain(String[]args){
  7. //TODOAuto-generatedmethodstub
  8. MyDatedate=newMyDate();
  9. date=null;
  10. System.gc();
  11. }
  12. }
复制代码
运转了局:
obj[Date:1372137067328]isgc
了局剖析:挪用了System.gc(),使JVM运转渣滓接纳,MyDate的finalize()办法被运转。
情形3:隐式挪用渣滓接纳

完成代码:
  1. packagecom.skywang.java;
  2. publicclassImplicitGarbageRetrieve{
  3. /**
  4. *@paramargs
  5. */
  6. publicstaticvoidmain(String[]args){
  7. //TODOAuto-generatedmethodstub
  8. MyDatedate=newMyDate();
  9. date=null;
  10. ReferenceTest.drainMemory();
  11. }
  12. }
复制代码
运转了局:
obj[Date:1372137171965]isgc
了局剖析:固然没有显式挪用渣滓接纳办法System.gc(),可是因为运转了泯灭大批内存的办法,触发JVM举行渣滓接纳。
总结:JVM的渣滓接纳机制,在内存充分的情形下,除非你显式挪用System.gc(),不然它不会举行渣滓接纳;在内存不敷的情形下,渣滓接纳将主动运转
3、Java对援用的分类
3.1强援用

实例代码:
  1. packagecom.skywang.java;
  2. publicclassStrongReferenceTest{
  3. publicstaticvoidmain(String[]args){
  4. MyDatedate=newMyDate();
  5. System.gc();
  6. }
  7. }
复制代码
运转了局:
<p>
Java到底会发战成什么样,让我们拭目以待吧,我始终坚信着java会更好。以上都是俺个人看法,欢迎大家一起交流.
小妖女 该用户已被删除
沙发
发表于 2015-1-20 12:34:29 | 只看该作者
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
灵魂腐蚀 该用户已被删除
板凳
发表于 2015-1-29 07:09:23 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
蒙在股里 该用户已被删除
地板
发表于 2015-2-6 14:33:32 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
5#
发表于 2015-2-16 12:19:02 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
冷月葬花魂 该用户已被删除
6#
发表于 2015-3-5 06:06:09 | 只看该作者
是一种为 Internet发展的计算机语言
乐观 该用户已被删除
7#
发表于 2015-3-11 23:35:58 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
兰色精灵 该用户已被删除
8#
发表于 2015-3-19 16:09:33 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
金色的骷髅 该用户已被删除
9#
发表于 2015-3-29 00:24:11 | 只看该作者
是一种突破用户端机器环境和CPU
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 19:27

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表