J2EE应用开发问题总结及最佳实践.ppt

上传人:wuy****n92 文档编号:70792851 上传时间:2023-01-28 格式:PPT 页数:53 大小:342.49KB
返回 下载 相关 举报
J2EE应用开发问题总结及最佳实践.ppt_第1页
第1页 / 共53页
J2EE应用开发问题总结及最佳实践.ppt_第2页
第2页 / 共53页
点击查看更多>>
资源描述

《J2EE应用开发问题总结及最佳实践.ppt》由会员分享,可在线阅读,更多相关《J2EE应用开发问题总结及最佳实践.ppt(53页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、IBM Software Group 2006 IBM CorporationJ2EE应用开发问题总结及最佳实践应用开发问题总结及最佳实践IBM Software Group 2006 IBM Corporation内容内容J2EEJ2EE应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结J2EE应用上线后遇到的问题总结J2EE应用开发部署最佳实践一些例子分析2IBM Software Group 2006 IBM CorporationJ2EE应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结-数据库部分数据库部

2、分问题一:使用Oracle数据库,大于4k的附件上传有问题,会报:Connection reset by peer:socket write error错误解答:附件上传过程是先上传到应用服务器,再以二进制形式保存到BLOB字段。上传组件采用SmartUpload,上传过程没有问题。问题出在对BLOB字段的操作上,在获取到附件的流对象后,用PreparedStatement的ps.setBinaryStream(),然后再ps.executeUpdate()。这种方式对小于4k的附件没有问题,大于4k就会报错。解决办法是 在插入BLOB字段值时,要先用SELECT BLOBCOL FROM T

3、ABLENAME FOR UPDATE查询和锁定该字段,然后再做更新。3IBM Software Group 2006 IBM CorporationJ2EE应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结-数据库部分数据库部分问题二:对Oracle BLOB字段的处理问题 解答:在Weblogic中,只能支持weblogic自带的对Oracle BLOB处理的类,而在WebSphere中,只能支持Oracle自带的处理BLOB的类,因此在程序中根据条件分支判断应用服务器的类型来决定用哪个类处理BLOB。4IBM Software Group 2006 IBM Corporatio

4、nJ2EE应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结-数据库部分数据库部分问题三:流程定义文件加载问题,加载流程定义文件的过程就是解析并将文件中的流程描述信息提交到数据库表。在一个连接事务中,如果多次调用PreparedStatement的addBatch()、executeBatch()方法做批量数据更新,会报错误。解答:应用服务器中数据源的PreparedStatementCacheSize默认设置为10,需要改为0不缓存或者改为100,就可以使用executeBatch()了 5IBM Software Group 2006 IBM CorporationJ2EE应用开

5、发和移植中遇到的问题总结应用开发和移植中遇到的问题总结-JSP部分部分问题一:JSP自定义标签属性大小写解答:在使用系统自定义的标签属性时,属性名必须严格区分大小写,否则JSP编译不通过。6IBM Software Group 2006 IBM CorporationJ2EE应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结-JSP部分部分问题二:URL编码问题,通过单击打印按钮请求一些报表打印页面时编译出错,会抛出传入的参数不合法的异常解答:由于URL编码格式引起的,如 jbtsxf_xfcl_bb.jsp?where=aab001 like%D,在URL编码中以%开头后面跟两位1

6、6进制编码代表一些特殊字符,这里的%D不对应任何特殊字符,所以出错。解决办法是将URL串中的特殊字符用对应的URL编码代替,如把%用%25代替。具体可以参考以下网址:7IBM Software Group 2006 IBM CorporationJ2EE应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结-JSP部分部分问题三:文件名的大小写解答:通过include引入文件时也要区分文件路径的大小写,系统中绝大部分JSP的head和body开始部分都会引入系统公用的两个文件,即:/htmlHead.jsp和/bodyStart.jsp,但在不少地方被引用为/htmlhead.jsp和/

7、bodystart.jsp,这在WebSphere上会引起编译错误。8IBM Software Group 2006 IBM CorporationJ2EE应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结-JSP部分部分问题四:JSP标准标签属性值误用问题解答:如,flush属性应该只有true和false两个有效值,如果flush取其它值,JSP编译也不通过。9IBM Software Group 2006 IBM CorporationJ2EE应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结-JSP部分部分问题五:JSP中import Vector类的问题 解答:在

8、JSP中已经import了class A,而class A中已经import了Vector,因此JSP里面要应用Vector的时候就没有再去import Vector,导致编译出错。10IBM Software Group 2006 IBM CorporationJ2EE应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结-JSP部分部分问题六:jsp:param name=value=解答:jsp:param里面的name属性不能使用jsp表达式赋值,参考jsp1.2 spec name是不能使用表达式的。修改name为定义好的字符串常量 11IBM Software Group 2

9、006 IBM CorporationJ2EE应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结-JSP部分部分问题七:某个页面readfile.jsp有时候能正常访问,有时候出现http 404解答:readfile.jsp中需要用到某个htc文件,但该htc文件的路径有误导致IE在最后渲染时提示找不到文件,需要修改htc路径。12IBM Software Group 2006 IBM CorporationJ2EE应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结-JSP部分部分问题八:某个jsp页面使用引入HTML页面,出现乱码 解答:引入的HTML页面也必须使用进行

10、声明,由于是静态引入方式,修改这些包含页面后,对原来的jsp也应该进行重新编译才能获得效果。但是只适用于WebSphere6。如果是采用动态引入方式的话,就不需要手动进行重新编译。13IBM Software Group 2006 IBM CorporationJ2EE应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结-JSP部分部分问题九:在一个jsp页面中包含下载内容,调用了response.getOutputStream()方法时,抛出exception 解答:在jsp中已经隐含一个变量out,相当于调用了response.getPrintWriter(),因此再次调用resp

11、onse.getOutputStream()时会抛出输出流已经获得的异常。可以修改代码,不采用jsp调用形式,改用servlet直接使用流输出。14IBM Software Group 2006 IBM CorporationJ2EE应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结-JSP部分部分问题十:不要用关键字来定义变量 解答:在执行 之前,代码定义一个变量String org;其中org属于关键字,因此编译的错误!15IBM Software Group 2006 IBM CorporationJ2EE应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结-JSP部分

12、部分问题十一:JSP中使用ShowModalDialog弹出一个新窗口会造成session丢失 解答:改成用Window.open()16IBM Software Group 2006 IBM CorporationJ2EE应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结-JSP部分部分问题十二:jsp:forward抛出异常::解答:jsparam name=BCCP64 value=/jsparam name=returnURL value=/jsparam name=BAE001 value=/在有jsp:forward语句的jsp中,不能有其他html的元素的输出 17IB

13、M Software Group 2006 IBM CorporationJ2EE应用开发和移植中遇到的问题总结应用开发和移植中遇到的问题总结-体系架构部分体系架构部分问题:在实现异步消息侦听的功能时,采用一个非容器受管的线程实现接口来完成,并没有使用MDB,导致在WebSphere上出现异常错误,被迫要改成同步侦听的方式,使性能下降。解答:在J2EE规范中提倡采用MDB来完成异步消息侦听的工作,而不接受自己用线程来实现的做法。这样做的好处是因为MDB是受EJB容器管理的一个组件,开发和维护简单,移植性好。18IBM Software Group 2006 IBM Corporation内容内

14、容J2EE应用开发和移植中遇到的问题总结J2EEJ2EE应用上线后遇到的问题总结应用上线后遇到的问题总结应用上线后遇到的问题总结应用上线后遇到的问题总结J2EE应用开发部署最佳实践一些例子分析19IBM Software Group 2006 IBM CorporationJ2EE应用上线后遇到的问题总结应用上线后遇到的问题总结-使用开源组件使用开源组件问题一:采用SmartUpload组件实现文件上传功能,SmartUpload组件本身存在一定的缺陷,容易造成内存泄漏。解答:通过对heapdump文件进行分析,对系统出现的OutOfMemory现象,是因为在SmartUpload中有一段代码

15、不是十分严密,会在某种情况下出现死循环,然后导致系统内存溢出,不能正常提供服务。解决的办法是对SmartUpload的代码进行部分修改,使之不产生死循环。具体的分析过程请参考附件一。20IBM Software Group 2006 IBM CorporationJ2EE应用上线后遇到的问题总结应用上线后遇到的问题总结-优化对数据库的访问优化对数据库的访问问题二:某些jdbc语句过于庞大,导致该语句的执行时间过长而锁住了jdbc连接等资源不被释放。解答:建议检查sql语句的效率,把一个语句中执行的复杂操作优化成效率高的sql语句来执行。select sqlb,currenthj,current

16、state,sum(jjbs0),sum(jjbs1),sum(jjbs2),sum(tbbs1),tbdwbh from Todolist where sqlb=101 and(currenthj=001 or currenthj=006 or currenthj=011 or.)and(clr=st001 or clr is null)and(tbdwbh like 44%)group by sqlb,currenthj,currentstate,tbdwbh order by sqlb,currenthj,currentstate,tbdwbhselect sqlb,currenthj,

17、currentstate,sum(jjbs0),sum(jjbs1),sum(jjbs2),sum(tbbs1),tbdwbh from Todolist where sqlb=101 and(currenthj in(001,006,011,016,021,031I1,031I2,031I3,031J1,031J2,031J3,031K1,031K2,031K3,031M1,031M2,031M3,041,050,052,056,061,062,063,066,071,076,078,081,086,087,088,089,090,091,092,096,101,106,108,111)an

18、d(clr=st001 or clr is null)and(tbdwbh like 44%)group by sqlb,currenthj,currentstate,tbdwbh order by sqlb,currenthj,currentstate,tbdwbh21IBM Software Group 2006 IBM CorporationJ2EE应用上线后遇到的问题总结应用上线后遇到的问题总结问题三:防火墙策略的影响解答:假如应用服务器连接数据库的时候要通过防火墙的话,那么要仔细设置策略中的超时部分,不要与应用服务器连接数据库的超时设置相抵触。如果防火墙的超时设置要短于应用服务器的设

19、置,那么数据库连接就会被防火墙频繁的截断,从而引起性能的下降。22IBM Software Group 2006 IBM CorporationJ2EE应用上线后遇到的问题总结应用上线后遇到的问题总结-优化对数据库的访问优化对数据库的访问问题四:要珍惜jdbc连接资源解答:jdbc连接是非常宝贵的资源,当要用到的时候才去获取,而不要占住了一个连接却不使用它,也不要使用完了不释放它,这样会使应用程序的效率很低。总结来说,就是在初始化的时候对datasource作一次jndi lookup的动作,然后接下来当要使用jdbc连接的时候通过getConnection获取连接,在使用完毕后通过conn.

20、close()关闭,使之返回到连接池中被其他代码使用。23IBM Software Group 2006 IBM CorporationJ2EE应用上线后遇到的问题总结应用上线后遇到的问题总结-使用开源框架使用开源框架问题五:慎用各种开源的框架解答:目前各种开源的框架非常流行,例如hibernate,tapestry,struts,spring等等,这些框架使用起来也会简化开发的工作量,但是一定要注意这些框架下的合理参数配置,否则会引起系统级别的性能问题。例如在出入境的性能问题中,基本上都是因为这些框架下的参数没有正确的配置引起太多对象堆积在内存空间中不能被释放,造成内存泄漏。具体问题的分析办

21、法请参考附件二和附件三。24IBM Software Group 2006 IBM CorporationJ2EE应用上线后遇到的问题总结应用上线后遇到的问题总结问题六:关于WAS做集群的问题解答:应用程序的开发应该与应用服务器的拓扑结构相独立,而不应该成为部署的障碍。例如像广东省出入境如此庞大的系统,总共包括19台刀片服务器来运行应用服务器,如果能够建立起集群的环境,无论从部署、维护还有性能方面都能大大提高。25IBM Software Group 2006 IBM Corporation内容内容J2EE应用开发和移植中遇到的问题总结J2EE应用上线后遇到的问题总结J2EEJ2EE应用开发部

22、署最佳实践应用开发部署最佳实践应用开发部署最佳实践应用开发部署最佳实践一些例子分析26IBM Software Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-开发部分开发部分整体考虑4开发应遵循标准的软件工程方法论4开发应遵循J2EE规范4开发尽量使用成熟的框架以及开发模式4变量名、类名、对象名、包名应该遵循命名规范对象的构造4尽量避免在被经常调用的代码中创建对象4对于集合类(collection),应尽量初始化它的大小JVM会自动指定缺省大小如果超过,JVM会重新创建一个,释放掉原来的对象,加大JVM负担27IBM Software G

23、roup 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-开发部分开发部分4当一个类的多个实例在其本地的变量里访问一个特定的对象时,最好将这个变量设计为静态(static)的,而不是每个实例中变量里都存放那个对象的引用尽量重用对象的引用,而不是new4注意释放容器对象中所保存的指向别的对象的引用4尽量使用primitive数据类型4当只是访问一个类的某个方法时,不要创建该类的对象,而是将该方法设计成一个static的方法。4尽量简化类的继承关系和设计简单的构造函数4创建简单数据类型的数组要比初始化一个这样的数组快,创建一个复杂类型的数组要比克隆一个这样

24、的数组快28IBM Software Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-开发部分开发部分字符串(String)4事实:String对象是不可改变的4如果字符串在程序中可能被改变,比如增加、接或删除字符,就应使用StringBuffer。创建具有初始大小的StringBuffer对象,尽量重用该对象,而不使用“+”操作4分析字符串中的字符时,就不要使用String或StringBuffer,而是使用字符数组,特别是在循环中分析字符时更应该如此4尽量少用StringTokenizer,它的方法的性能比较差29IBM Softwar

25、e Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-开发部分开发部分输入输出(Input/Output)4小块小块的读写数据会非常慢,因此,尽量大块的读写数据 4使用BufferedInputStream和BufferedOutputStream来批处理数据以提高性能 4对象的序列化(serialization)非常影响I/O的性能,尽量少用 4对不需序列化的类的域使用transient关键字,以减少序列化的数据量30IBM Software Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实

26、践-开发部分开发部分循环(Loop)4循环常量,在循环中它的值不会改变,因此,它的值应该在循环外先计算出来。4本地变量(Local Variable),在方法中使用本地变量比使用对象的属性消耗较少的资源。在循环中却不一样,因为循环中的代码要反复地被运行,因此,尽量少地在循环中创建对象和变量。4尽早结束循环,如果循环体在满足一定条件就可以结束,就应尽快结束。31IBM Software Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-开发部分开发部分集合类(Collections)4Collection 这是集合类的基本接口,它为一组对象提供

27、了一些简单的方法,4List 具有可以控制的顺序,但并没有定义或限制按什么排序 4Set 不能包含重复的元素 4Map 将一个键(Key)影射到一个值(Value),不允许有重复的键4Vector和ArrayListVector的方法都是同步的(Synchronized),是线程安全的(thread-safe)32IBM Software Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-开发部分开发部分ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好当Vector或ArrayList

28、中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间4Hashtable和HashMap 类似 Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是4ArrayList和LinkedListArrayList的内部实现是基于内部数组Object33IBM Software Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-开发部分开发部分LinkedList的内部实现是基于一组连接的记录,更像链表结构当操作是在一

29、列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能当操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了如果两种情形交替出现,可以考虑使用List这样的通用接口,而不用关心具体的实现,由实现去保证性能34IBM Software Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-开发部分开发部分方法(method)4Java编译器会把一些代码转为代码嵌入,提高性能4Final、static、private同步(Synchroni

30、zed)4使用同步方法比使用非同步方法的性能要低4应尽量少使用同步方法4同步方法的代码本身就不应该再同步了35IBM Software Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-开发部分开发部分EJB部分4为EJB实现本地接口 4始终通过会话Bean访问实体Bean 4尽量缓存对EJB Home的访问 4当使用 EJB 组件时,始终使用会话 Facades 4尽量使用无状态会话 bean,而不是有状态会话 bean4尽量使用容器管理的事务 36IBM Software Group 2006 IBM CorporationJ2EE应用开

31、发部署最佳实践应用开发部署最佳实践-开发部分开发部分Servlet部分4init()做尽可能多的工作只在初始化是执行一次4尽可能少地使用 Synchronize确保不要 synchronize 整个类4不要用任何实例变量被所有在线的用户使用4不要使用SingleThreadModel虽然是 thread-safe,但性能太差4对于非 Java 群体:不要在 cookies 中存对象使用 HttpSession 代替37IBM Software Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-开发部分开发部分JSP部分4保持尽量少的Java代

32、码JSP中的Java代码很难维护和测试绝对不要将业务逻辑放在JSP中编写 helper classes 从数据生成HTMLOne of the few times putting hardcoding HTML in Java is okay理想情况下只使用“”tags4在每一个JSP只包含用于显示数据的简单对象有时称之为“view bean”,但不用是一个真的 JavaBean限定 JSP 只做显示工作,抵制在其中编写的商业逻辑的诱惑38IBM Software Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-开发部分开发部分JSP部分4

33、如果在页面中你要共享组件和项目,使用如下表格E.g.对于菜单,标题栏,页脚,等等可以使用 HTML 或者 JSP include 指令可以包括静态 HTML,或者其它 JSP4不要忘记在整个 JSP 中使用 try/catch如果在 JSP 中抛出一个异常,它不能被 servlet 捕获作为替代,将所有有异议的代码放在头部,将这一部分封装在try/catch 中39IBM Software Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-开发部分开发部分数据库访问部分4规格化(Normalization)数据库结构 4针对常用的SQL操作建

34、立索引,删除多余的索引 4尽量使用Prepared Statements 4合理运用PreparedStatement和连接池 4考虑批量执行SQL命令 4考虑使用数据库存储过程4及时关闭不用的Statement、ResultSet、Connection等对象(但不是在finalize方法内)40IBM Software Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-开发部分开发部分HttpSession部分4确保放在session 中的每一个对象要实现 Serializable(or Externalizable)不是必须的,但在分布式

35、应用中是一个好的方法4避免在 session 中存放大对象4手工使 session 无效Can only do this if application has explicit log out function4如果在JSP中不需要session,禁用它41IBM Software Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-开发部分开发部分其它4JSP中保持尽量少的Java代码 4尽可能减少HTTP数据传输的总量和频度 4尽量使用局部变量 4不要重复初始化变量4只有在必要时才运用线程安全的类 4在servlet、EJB中不要使用多线程

36、4尽量使用日志记录框架类如log4j输出跟踪信息,而不是使用简单的()4从正式发行的软件中删除调试信息42IBM Software Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-开发部分开发部分备注:WAS是遵循J2EE标准的成熟的应用服务器(可用性99.999%),其可靠性远高于应用,在系统出现问题时,请首先考虑应用的问题!43IBM Software Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-部署管理部分部署管理部分根据应用状况设置JAVA堆大小 根据应用状况设置webcon

37、tainer thread pool size大小 根据应用状况设置ORB thread pool size大小 根据应用状况设置JDBC connection pool size大小 根据应用状况设置JDBC connection的prefetch size大小 多个应用共用jar包时使用共享库 尽量缓存会话、有状态会话bean DM上的结点数(Nodes)30 每个节点上的server数(Application servers per node)20 44IBM Software Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-部署管理

38、部分部署管理部分每个单元中的server数(Total number of application servers per cell)60即总的(application servers x nodes)60 每个sever上的应用数(Applications per application server)100 每个应用上的EJB数(EJBs per application)250 在生产平台尽量少打日志 具备规范的生产、测试平台、生产平台,最好物理分开,限制可以接触到生产平台的人员 借助测试工具进行大于生产压力的压力测试 根据压力测试结果,调整系统参数、WAS参数,然后继续测试以验证调整效果

39、 45IBM Software Group 2006 IBM CorporationJ2EE应用开发部署最佳实践应用开发部署最佳实践-部署管理部分部署管理部分应用必须经过开发平台测试,才能上测试平台,经过测试平台测试才能正式上生产 46IBM Software Group 2006 IBM Corporation内容内容J2EE应用开发和移植中遇到的问题总结J2EE应用上线后遇到的问题总结J2EE应用开发部署最佳实践一些例子分析一些例子分析一些例子分析一些例子分析47IBM Software Group 2006 IBM Corporation一些例子分析一些例子分析无意识的集合对象保留Vec

40、tor v=new Vector(10);for(int i=1;i100;i+)Object o=new Object();v.add(o);o=null;问题:上面用的Vector中的临时对象Object被释放了吗?回答:没有!48IBM Software Group 2006 IBM Corporation一些例子分析一些例子分析显示的赋Null值起作用吗?4定义:赋空变量是指简单地将 null 值显式地赋值给这个变量,相对于让该变量的引用失去其作用域4最佳实践正确地设置变量的作用域,而不要显式地赋空它们显式赋空变量一般应该没有影响但是,在一些场合下会对性能产生巨大的负面影响例如,迭代的

41、或者递归的赋空集合内的元素使得这些集合中的对象能够满足垃圾收集的条件实际上是增加了系统的开销而不是帮助垃圾收集49IBM Software Group 2006 IBM Corporation一些例子分析一些例子分析4所以前面的例子中,怎么样才是相对比较好的办法让JVM 把Vector里面的申请的Object回收?正解:For(int i=1;i100;i+)v.remove(o);50IBM Software Group 2006 IBM Corporation一些例子分析一些例子分析4局部作用域一个例子public static String scopingExample(String n

42、ame)StringBuffer sb=new StringBuffer();sb.append(“hello”).append(name);return sb.toString();问题:当方法执行完后,String Buffer能被回收吗?4静态作用域一个例子static StringBuffer sb=new StringBuffer();public static String scopingExample(String name)sb=new StringBuffer();sb.append(hello).append(name);sb.append(,nice to see you

43、!);return sb.toString();问题:当方法执行完后,String Buffer能被回收吗?51IBM Software Group 2006 IBM Corporation一些例子分析一些例子分析例子一:当该方法执行时,运行时栈保留了一个对 StringBuffer 对象的引用,这个对象是在程序的第一行产生的。在这个方法的整个执行期间,栈保存的这个对象引用将会防止该对象被当作垃圾。当这个方法执行完毕,变量 sb 也就失去了它的作用域,相应地运行时栈就会删除对该 StringBuffer 对象的引用。于是不再有对该 StringBuffer 对象的引用,现在它就可以被当作垃圾收

44、集了。栈删除引用的操作就等于在该方法结束时将 null 值赋给变量 sb例子二:现在 sb 是一个静态变量,所以只要它所在的类还装载在 Java 虚拟机中,它也将一直存在。该方法执行一次,一个新的 StringBuffer 将被创建并且被 sb 变量引用。在这种情况下,sb 变量以前引用的 StringBuffer 对象将会死亡,成为垃圾收集的对象。也就是说,这个死亡的 StringBuffer 对象被程序保留的时间比它实际需要保留的时间长得多如果再也没有对该 scopingExample 方法的调用,它将会永远保留下去52IBM Software Group 2006 IBM Corporation总结总结你不能调优一个坏的应用你不能调优一个坏的应用你不能调优一个坏的应用你不能调优一个坏的应用你不能调优一个坏的应用你不能调优一个坏的应用你不能调优一个坏的应用你不能调优一个坏的应用53

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com