仓酷云

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

[学习教程] 发布一篇必需实行扫除

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

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

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

x
net网页编程程序员的大部门代码都靠控件拖拽完成的,虽然java也有,但是无论从美观和速度上都没发和.net网页编程比。java程序员都是代码完成的,所以java程序员常戏称.net网页编程程序员是操作员,呵呵。
为扫除一个对象,谁人对象的用户必需在但愿举行扫除的地址挪用一个扫除办法。这听起来仿佛很简单做到,但却与C++“损坏器”的观点稍有冲突。在C++中,一切对象城市损坏(扫除)。大概换句话说,一切对象都“应当”损坏。若将C++对象创立成一个当地对象,好比在仓库中创立(在Java中是不成能的),那末扫除或损坏事情就会在“停止花括号”所代表的、创立这个对象的感化域的开端举行。若对象是用new创立的(相似于Java),那末当程序员挪用C++的delete命令时(Java没有这个命令),就会挪用响应的损坏器。若程序员健忘了,那末永久不会挪用损坏器,我们终极失掉的将是一个内存“毛病”,别的还包含对象的其他部分永久不会失掉扫除。
相反,Java不同意我们创立当地(部分)对象——不管怎样都要利用new。但在Java中,没有“delete”命令来开释对象,由于渣滓搜集器会匡助我们主动开释存储空间。以是假如站在对照简化的态度,我们能够说恰是因为存在渣滓搜集机制,以是Java没有损坏器。但是,跟着今后进修的深切,就会晓得渣滓搜集器的存在其实不能完整打消对损坏器的必要,大概说不克不及打消对损坏器代表的那种机制的必要(并且相对不克不及间接挪用finalize(),以是应只管制止用它)。若但愿实行除开释存储空间以外的其他某种情势的扫除事情,仍旧必需挪用Java中的一个办法。它等价于C++的损坏器,只是没后者便利。
finalize()最有效处的中央之一是察看渣滓搜集的历程。上面这个例子向人人展现了渣滓搜集所履历的历程,并对后面的报告举行了总结。
  1. //:Garbage.java
  2. //Demonstrationofthegarbage
  3. //collectorandfinalization
  4. classChair{
  5. staticbooleangcrun=false;
  6. staticbooleanf=false;
  7. staticintcreated=0;
  8. staticintfinalized=0;
  9. inti;
  10. Chair(){
  11. i=++created;
  12. if(created==47)
  13. System.out.println("Created47");
  14. }
  15. protectedvoidfinalize(){
  16. if(!gcrun){
  17. gcrun=true;
  18. System.out.println(
  19. "Beginningtofinalizeafter"+
  20. created+"Chairshavebeencreated");
  21. }
  22. if(i==47){
  23. System.out.println(
  24. "FinalizingChair#47,"+
  25. "SettingflagtostopChaircreation");
  26. f=true;
  27. }
  28. finalized++;
  29. if(finalized>=created)
  30. System.out.println(
  31. "All"+finalized+"finalized");
  32. }
  33. }
  34. publicclassGarbage{
  35. publicstaticvoidmain(String[]args){
  36. if(args.length==0){
  37. System.err.println("Usage:
  38. "+
  39. "javaGarbagebefore
  40. or:
  41. "+
  42. "javaGarbageafter");
  43. return;
  44. }
  45. while(!Chair.f){
  46. newChair();
  47. newString("Totakeupspace");
  48. }
  49. System.out.println(
  50. "AfterallChairshavebeencreated:
  51. "+
  52. "totalcreated="+Chair.created+
  53. ",totalfinalized="+Chair.finalized);
  54. if(args[0].equals("before")){
  55. System.out.println("gc():");
  56. System.gc();
  57. System.out.println("runFinalization():");
  58. System.runFinalization();
  59. }
  60. System.out.println("bye!");
  61. if(args[0].equals("after"))
  62. System.runFinalizersOnExit(true);
  63. }
  64. }///:~
复制代码
下面这个程序创立了很多Chair对象,并且在渣滓搜集器入手下手运转后的某些时分,程序会中断创立Chair。因为渣滓搜集器大概在任什么时候间运转,以是我们不克不及正确晓得它在什么时候启动。因而,程序用一个名为gcrun的标志来指出渣滓搜集器是不是已入手下手运转。使用第二个标志f,Chair可告知main()它应中断对象的天生。这两个标志都是在finalize()外部设置的,它挪用于渣滓搜集时代。
另两个static变量——created和finalized——分离用于跟踪已创立的对象数目和渣滓搜集器已举行完扫尾事情的对象数目。最初,每一个Chair都有它本人的(非static)inti,以是能跟踪懂得它详细的编号是几。编号为47的Chair举行完扫尾事情后,标志会设为true,终极停止Chair对象的创立历程。
一切这些都在main()的外部举行——鄙人面这个轮回里:

while(!Chair.f){
newChair();
newString("Totakeupspace");
}

人人大概会困惑这个轮回甚么时分会停上去,由于外部没有任何改动Chair.f值的语句。但是,finalize()历程会改动这个值,直至终极对编号47的对象举行扫尾处置。
每次轮回过程当中创立的String对象只是属于分外的渣滓,用于吸引渣滓搜集器——一旦渣滓搜集器对可用内存的容量感应“严重不安”,就会入手下手存眷它。
运转这个程序的时分,供应了一个命令行自变量“before”大概“after”。个中,“before”自变量会挪用System.gc()办法(强迫实行渣滓搜集器),同时还会挪用System.runFinalization()办法,以便举行扫尾事情。这些办法都可在Java1.0中利用,但经由过程利用“after”自变量而挪用的runFinalizersOnExit()办法却只要Java1.1及后续版本供应了对它的撑持(正文③)。注重可在程序实行的任什么时候候挪用这个办法,并且扫尾程序的实行与渣滓搜集器是不是运转是有关的。

③:不幸的是,Java1.0接纳的渣滓搜集器计划永久不克不及准确地挪用finalize()。因而,finalize()办法(出格是那些用于封闭文件的)现实上常常都不会失掉挪用。如今有些文章宣称一切扫尾模块城市在程序加入的时分失掉挪用——即便到程序中断的时分,渣滓搜集器仍未针对那些对象接纳举动。这并非实在的情形,以是我们基本不克不及期望finalize()能为一切对象而挪用。出格地,finalize()在Java1.0里几近毫无用途。

后面的程序向我们展现出:在Java1.1中,扫尾模块一定会运转这一允诺已成为实际——但条件是我们明白地强迫它接纳这一操纵。若利用一个不是“before”或“after”的自变量(如“none”),那末两个扫尾事情都不会举行,并且我们会失掉象上面如许的输入:
Created47
  1. Created47
  2. Beginningtofinalizeafter8694Chairshavebeencreated
  3. FinalizingChair#47,SettingflagtostopChaircreation
  4. AfterallChairshavebeencreated:
  5. totalcreated=9834,totalfinalized=108
  6. bye!
复制代码
因而,到程序停止的时分,并不是一切扫尾模块城市失掉挪用(正文④)。为强迫举行扫尾事情,可先挪用System.gc(),再挪用System.runFinalization()。如许可扫除到今朝为止没有利用的一切对象。如许做一个稍显奇异的中央是在挪用runFinalization()之前挪用gc(),这看起来仿佛与Sun公司的文档申明有些冲突,它传播鼓吹起首运转扫尾模块,再开释存储空间。但是,若在这里起首挪用runFinalization(),再挪用gc(),扫尾模块基本不会实行。

④:到你读到本书时,有些Java假造机(JVM)大概已入手下手体现出分歧的举动。

针对一切对象,Java1.1偶然之以是会默许为跳过扫尾事情,是因为它以为如许做的开支太年夜。不论用哪一种办法强迫举行渣滓搜集,都大概注重到比没有分外扫尾事情时较长的工夫提早。
轮性能微软曾做过一个例子,就是同一个项目用java和.net网页编程来作,结果开发周期,.net网页编程是java的一半,性能java是.net网页编程的十分之一,代码量java是.net网页编程的三倍。呵呵,这说明了什么,.net网页编程的全方位比java好。但是有的人说.net网页编程不能跨平台,这个问题我和我同学曾讨论过,都认为微软的.net网页编程很可能早都可以跨平台了,但是微软为了保护他们的操作系统,所以才没有推出跨平台的.net网页编程,只是推出了跨语言的.net网页编程,
老尸 该用户已被删除
沙发
发表于 2015-1-30 16:10:48 | 只看该作者
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
若天明 该用户已被删除
板凳
 楼主| 发表于 2015-1-30 16:10:48 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
因胸联盟 该用户已被删除
地板
发表于 2015-2-8 05:24:03 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
冷月葬花魂 该用户已被删除
5#
发表于 2015-2-24 08:16:36 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
透明 该用户已被删除
6#
发表于 2015-2-26 11:22:16 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
蒙在股里 该用户已被删除
7#
发表于 2015-3-1 21:39:17 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
飘灵儿 该用户已被删除
8#
发表于 2015-3-5 20:33:27 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
简单生活 该用户已被删除
9#
发表于 2015-3-12 14:34:38 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
再现理想 该用户已被删除
10#
发表于 2015-3-19 22:48:39 | 只看该作者
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
精灵巫婆 该用户已被删除
11#
发表于 2015-3-22 19:10:33 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
海妖 该用户已被删除
12#
发表于 2015-3-25 13:17:07 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
莫相离 该用户已被删除
13#
发表于 2015-4-3 04:35:03 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
不帅 该用户已被删除
14#
发表于 2015-4-6 23:28:46 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
山那边是海 该用户已被删除
15#
发表于 2015-4-7 21:44:51 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
柔情似水 该用户已被删除
16#
发表于 2015-4-13 15:43:48 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
再见西城 该用户已被删除
17#
发表于 2015-4-13 19:34:13 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
18#
发表于 2015-4-21 17:17:18 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
飘飘悠悠 该用户已被删除
19#
发表于 2015-5-6 14:11:58 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-23 17:55

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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