??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品亚洲аv无码播放,国产偷v国产偷v亚洲高清,亚洲精品无码久久久http://www.tkk7.com/patrick/category/6249.htmlPatrick's Blogzh-cnThu, 01 Mar 2007 19:00:56 GMTThu, 01 Mar 2007 19:00:56 GMT60Weblogic服务器性能调优http://www.tkk7.com/patrick/archive/2005/12/30/26056.html大狮子慢慢爬的Blog大狮子慢慢爬的BlogFri, 30 Dec 2005 06:44:00 GMThttp://www.tkk7.com/patrick/archive/2005/12/30/26056.htmlhttp://www.tkk7.com/patrick/comments/26056.htmlhttp://www.tkk7.com/patrick/archive/2005/12/30/26056.html#Feedback4http://www.tkk7.com/patrick/comments/commentRss/26056.htmlhttp://www.tkk7.com/patrick/services/trackbacks/26056.htmlWeblogic服务器性能调优

       注:在下面做的介l都是以Weblogic8.1Z的,其它版本?/SPAN>Weblogic可能会有些许不同?/SPAN>

       1) JAVA参数Q?/SPAN>

       a) ~辑Weblogic Server启动脚本文gQ?/SPAN>

l         BEA_HOME\user_projects\domains\domain-name\startWebLogic.cmd(startWebLogic.sh on Unix)

l         BEA_HOME\user_projects\domains\domain-name\startManagedWebLogic.cmd(startManagedWebLogic.sh on Unix)

b) ~辑set JAVA_OPTIONS命oQ如Q?/SPAN>set JAVA_OPTIONS=-Xms256m –Xmx256mQ?/SPAN>

c) 保存Q重启即可?/SPAN>

注:?/SPAN>WebLogic中,Z获得更好的性能Q?/SPAN>BEA公司推荐最?/SPAN>Java堆等于最?/SPAN>Java堆?/SPAN>

2) 开发模?/SPAN> vs. 产品模式Q?/SPAN>

开发模式和产品模式的一些参数的默认g同,可能会对性能造成影响Q下面是Ҏ能有媄响的参数列表Q?/SPAN>

参数

开发模式默认?/SPAN>

产品模式默认?/SPAN>

Execute Queue: Thread Count

15 threads

25 threads

JDBC Connection Pool: MaxCapacity

15 connnections

25 connections

       通过启动理控制収ͼ在域Q如Q?/SPAN>mydomainQ?/SPAN>> 配置 > 常规选择产品模式?/SPAN>

3) 量开启本?/SPAN>I/OQ?/SPAN>

通过启动理控制収ͼ在域Q如Q?/SPAN>mydomainQ?/SPAN>> 服务?/SPAN> > server实例Q如Q?/SPAN>myserverQ?/SPAN>> 配置 > 调整选择启用本地I/O?/SPAN>

注:此g可通过手动的修?/SPAN>config.xml配置文g?/SPAN>

4) 调优执行队列U程Q?/SPAN>

a) 修改默认执行U程?/SPAN>

在这里,执行队列的线E数表示执行队列能够同时执行的操作的数量。但此g是设的越大越好,应该恰到好处的去讄它,太小了,执行队列中将会积累很多待处理的Q务,太大了,则会消耗大量的pȝ资源从而媄响整体的性能。在产品模式下默认ؓ25个执行线E?/SPAN>

Z讄理想的执行队列的U程敎ͼ我们可以启动理控制収ͼ在域Q如Q?/SPAN>mydomainQ?/SPAN>> 服务?/SPAN> > server实例Q如Q?/SPAN>myserverQ?/SPAN>> 监视 > 性能中监控最大负载时执行队列的吞吐量和队列中的等待请求数Q据此确定理想的数倹{?/SPAN>

       理想的默认执行线E数是由多方面的因素军_的,比如机器CPU性能、M体系架构?/SPAN>I/O、操作系l的q程调度机制?/SPAN>JVM的线E调度机制。随着CPU个数的增加,WebLogic可以q乎U性地提高U程数。线E数多Q花费在U程切换的时间也p多;U程数越,CPU可能无法得到充分的利用。ؓ获取一个理想的U程敎ͼ需要经q反复的试。在试中,可以?/SPAN>25*CPU个数为基准进行调整。当I闲U程较少Q?/SPAN>CPU利用率较低时Q可以适当增加U程数的大小Q每五个递增Q。对?/SPAN>PC Server?/SPAN>Windows 2000Q则最好每?/SPAN>CPU50个线E,?/SPAN>CPU利用率ؓ90%左右为最佟?/SPAN>

       通过启动理控制収ͼ在域Q如Q?/SPAN>mydomainQ?/SPAN>> 服务?/SPAN> > server实例Q如Q?/SPAN>myserverQ?/SPAN>> Execute Queue > weblogic.kernel.Defalt > 配置中修改线E计数?/SPAN>

       b) 讑֮执行队列的溢出条Ӟ

       Weblogic Server提供l默认的执行队列或用戯定义的执行队列自定义溢出条g的功能,当满x溢出条gӞ服务器改变其状态ؓ“警告”状态,q且额外的再分配一些线E去处理在队列中的请求,而达到降低队列长度的目的?/SPAN>

       通过启动理控制収ͼ在域Q如Q?/SPAN>mydomainQ?/SPAN>> 服务?/SPAN> > server实例Q如Q?/SPAN>myserverQ?/SPAN>> Execute Queue > weblogic.kernel.Defalt > 配置下面几项Q?/SPAN>

l         队列长度Q此DC执行队列中可容U的最大请求数Q默认值是65536Q最后不要手动改变此倹{?/SPAN>

l         队列长度阈值百分比Q此DC溢出条Ӟ在此服务器指出队列溢Z前可以达到的队列长度大小的百分比?/SPAN>

l         U程数增加:当检到溢出条gӞ增加到执行队列中的U程数量。如?/SPAN>CPU和内存不是够的高,量不要改变默认值?/SPAN>0”。因?/SPAN>Weblogic一旦增加后不会自动~减Q虽然最l可能确实vC降低h的作用,但在来的运行中媄响程序的性能?/SPAN>

l         最大线E数Qؓ了防止创多的U程数量Q可以通过讑֮最大的U程数进行控制?/SPAN>

在实际的应用场景中,应根据具体情况适当的调整以上参数?/SPAN>

c) 讑֮执行队列监测行ؓ

Weblogic Server能够自动监测到当一个执行线E变为“阻塞”。变为“阻塞”状态的执行U程无法完成当前的工作Q也无法再执行新h。如果执行队列中的所有执行线E都变ؓ“阻塞”状态,Weblogic server可能改变状态ؓ“警告”或“严重”状态。如?/SPAN>Weblogic server变ؓ“严重”状态,可以通过Node Manager来自动关闭此服务器ƈ重新启动它。具体请参考:Node Manager Capabilities文档?/SPAN>

通过启动理控制収ͼ在域Q如Q?/SPAN>mydomainQ?/SPAN>> 服务?/SPAN> > server实例Q如Q?/SPAN>myserverQ?/SPAN>>配置 > 调整下可配置下面几项Q?/SPAN>

l         dU程最长时_在此服务器将U程诊断为阻塞线E之前,U程必须q箋工作的时间长?/SPAN>(U?/SPAN>)。默认情况下Q?/SPAN>WebLogic Server 认ؓU程在连l工?/SPAN> 600 U后成ؓdU程?/SPAN>

l         dU程计时器间隔:WebLogic Server 定期扫描U程以查看它们是否已l连l工作了 "dU程最长时?/SPAN>" 字段中指定的旉长度的间隔时?/SPAN>(U?/SPAN>)。默认情况下Q?/SPAN>WebLogic Server 此旉间隔讄?/SPAN> 600 U?/SPAN>

5) 调优TCPq接~存敎ͼ

WebLogic Server?/SPAN>Accept Backlog参数规定服务器向操作pȝh的队列大,默认gؓ50。当pȝ重蝲负荷?/SPAN>,q个值可能过?/SPAN>,日志中报Connection Refused,D有效q接h遭到拒绝,此时可以提高Accept Backlog 25%直到q接拒绝错误消失。对?/SPAN>Portalcd的应?/SPAN>,默认值往往是不够的?/SPAN>Login Timeout?/SPAN>SSL Login Timeout参数表示普通连接和SSLq接的超时时?/SPAN>,如果客户q接被服务器中断或?/SPAN>SSL定w?/SPAN>,可以试增加该倹{?/SPAN>

通过启动理控制収ͼ在域Q如Q?/SPAN>mydomainQ?/SPAN>> 服务?/SPAN> > server实例Q如Q?/SPAN>myserverQ?/SPAN>>配置 > 调整下可配置“接受预备连接”?/SPAN>

6) 改变Java~译器;

标准?/SPAN>Java~译器是javacQ但~译JSP servlets速度太慢Qؓ了提高编译速度Q可以?/SPAN>sj?/SPAN>jikes~译器取?/SPAN>javac~译器。下面说说更?/SPAN>Java~译器:

通过启动理控制収ͼ在域Q如Q?/SPAN>mydomainQ?/SPAN>> 服务?/SPAN> > server实例Q如Q?/SPAN>myserverQ?/SPAN>>配置 > 常规下改?/SPAN>Java ~译?/SPAN>Q默认ؓjavac。输入完整\径,如:c:\visualcafe31\bin\sj.exe。然后打开高选项Q在预规划到c\?/SPAN>填写~译 Java 代码时ؓ Java ~译器类路径预规划的选项Q如Q?/SPAN>BEA_HOME\jdk141_02\jre\lib\rt.jar?/SPAN>

7) 使用Webogic Server集群提高性能Q?/SPAN>

具体关于如何配置Weblogic集群Q我׃l说了。详情可参考:Introduction to WebLogic Server Clustering?/SPAN>

8) Weblogic EJB调优

׃EJB2.0已经很少目在用了,EJB3.0再成熟一点,我再补充q一部分吧!

9) JDBC应用调优

JDBC Connection Pool的调优受制于WebLogic ServerU程数的讄和数据库q程?/SPAN>,游标的大。通常我们在一个线E中使用一个连?/SPAN>,所以连接数q不是越多越?/SPAN>,为避免两边的资源消耗,讄q接池的最大值等于或者略于U程数。同时ؓ了减新接的开销,最值和最大DZ致?/SPAN>

增加Statement Cache Size对于大量使用PreparedStatement对象的应用程序很有帮?/SPAN>,WebLogic能够为每一个连接缓存这些对?/SPAN>,此值默认ؓ10。在保证数据库游标大够的前提?/SPAN>,可以Ҏ需要提?/SPAN>Statement Cache Size。比如当你设|连接数?/SPAN>25,Cache Size?/SPAN>10?/SPAN>,数据库可能需要打开25*10=250个游标。不q的?/SPAN>,当遇CPreparedStatement Cache有关的应用程序错误时,你需要将Cache Size讄?/SPAN>0?/SPAN>

JDBC Connection Pool提供了很多高U参?/SPAN>,在开发模式下比较有用,但大部分在生产环境下不需调整。这里徏议最好不要设|测试表, 同时Test Reserved Connections?/SPAN>Test Released Connections也无需勾上?/SPAN> 当然如果你的数据库不E_,时断时箋,你就可能需要上q的参数打开?/SPAN>

最后提一下驱动程序类型的选择,?/SPAN>OracleZ,Oracle提供thin驱动?/SPAN>oci驱动,从性能上来?/SPAN>,oci驱动Zthin驱动,特别是大数据量的操作。但在简单的数据库操作中,性能相差不大,随着thin驱动的不断改q?/SPAN>,q一弱势得到I补。?/SPAN>thin驱动的移植性明昑ּ?/SPAN>oci驱动。所以在通常情况下徏议?/SPAN>thin驱动。而最新驱动器׃WebLogic server/bin目录下的cd可能不是最新的,请以Oracle|站为准: http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html?/SPAN>

10) JSP调优

l         jsp-param pageCheckSeconds=-1Q?/SPAN>

l         serlet-reload-check=-1?/SPAN>ServletReloadCheckSecs=-1Q?/SPAN>

l         jsp-param precompile=trueQ关?/SPAN>JSP预编译选项?/SPAN>



大狮子慢慢爬的Blog 2005-12-30 14:44 发表评论
]]>
操作pȝ调优http://www.tkk7.com/patrick/archive/2005/12/28/25697.html大狮子慢慢爬的Blog大狮子慢慢爬的BlogWed, 28 Dec 2005 04:53:00 GMThttp://www.tkk7.com/patrick/archive/2005/12/28/25697.htmlhttp://www.tkk7.com/patrick/comments/25697.htmlhttp://www.tkk7.com/patrick/archive/2005/12/28/25697.html#Feedback0http://www.tkk7.com/patrick/comments/commentRss/25697.htmlhttp://www.tkk7.com/patrick/services/trackbacks/25697.html阅读全文

大狮子慢慢爬的Blog 2005-12-28 12:53 发表评论
]]>
应用E序调优Q箋Q?/title><link>http://www.tkk7.com/patrick/archive/2005/12/26/25478.html</link><dc:creator>大狮子慢慢爬的Blog</dc:creator><author>大狮子慢慢爬的Blog</author><pubDate>Mon, 26 Dec 2005 10:28:00 GMT</pubDate><guid>http://www.tkk7.com/patrick/archive/2005/12/26/25478.html</guid><wfw:comment>http://www.tkk7.com/patrick/comments/25478.html</wfw:comment><comments>http://www.tkk7.com/patrick/archive/2005/12/26/25478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/patrick/comments/commentRss/25478.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/patrick/services/trackbacks/25478.html</trackback:ping><description><![CDATA[<H2 style="MARGIN: 13pt 0cm"><A name=_Toc123372421><SPAN lang=EN-US><FONT face=Arial>3.2 </FONT></SPAN></A><SPAN style="mso-bookmark: _Toc123372421"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">字符串的调优</SPAN></SPAN></H2> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face=Arial>       </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">下面列出一些常见的关于字符串优化的{略Q简单的我就不多作解释了?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN lang=EN-US><FONT face=Arial>1) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">使用规则表达式处理字W串匚w代替复杂的字W串查找和复制操作;</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN lang=EN-US><FONT face=Arial>2) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">使用不拷贝字W串中字W的高效ҎQ例?/SPAN><SPAN lang=EN-US><FONT face=Arial>String.subString()</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">ҎQ?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN lang=EN-US><FONT face=Arial>3) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">可能不要用需要拷贝字W串中字W的低效ҎQ例?/SPAN><SPAN lang=EN-US><FONT face=Arial>String.toUpperCase()</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>String.toLowercase()</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN lang=EN-US><FONT face=Arial>4) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">在编译期使用</SPAN><SPAN lang=EN-US><FONT face=Arial>String</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的?/SPAN><SPAN lang=EN-US><FONT face=Arial>+</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">”操作符来执行连接操作,在运行期使用</SPAN><SPAN lang=EN-US><FONT face=Arial>StringBuffer</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">执行q接操作Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">q里特别一下,因ؓ我已l在|上看到好多文章都推荐?/SPAN><SPAN lang=EN-US><FONT face=Arial>StringBuffer</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>append()</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Ҏ来做字符串的q接操作。其实在</SPAN><SPAN lang=EN-US><FONT face=Arial>JVM</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">能够在编译期p定l果的情形,使用</SPAN><SPAN lang=EN-US><FONT face=Arial>String</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的?/SPAN><SPAN lang=EN-US><FONT face=Arial>+</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">”操作符的性能要好很多?/SPAN></P> <H2 style="MARGIN: 13pt 0cm"><A name=_Toc123372422><SPAN lang=EN-US><FONT face=Arial>3.3 </FONT></SPAN></A><SPAN style="mso-bookmark: _Toc123372422"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">异常Q类型{换和变量</SPAN></SPAN></H2> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>1) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">考虑在抛出异常的时候是否可以不x生成堆栈信息而用一个已有的异常实例Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face=Arial>       </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">创徏异常的开销很大。当创徏一个异常时Q需要收集一个栈跟踪Q?/SPAN><SPAN lang=EN-US><FONT face=Arial>Stack Trace</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q,q个栈跟t用于描q异常是在何处创建的。构些栈跟踪旉要ؓq行时栈做一份快照,正是q一部分开销很大。运行时栈不是ؓ有效的异常创设计的Q而是设计用来让运行时可能快地运行。入栈,出栈Q入栈,出栈。让q样的工作顺利完成,而没有Q何不必要的gq。但是,当需要创Z?/SPAN><SPAN lang=EN-US><FONT face=Arial>Exception</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Ӟ</SPAN><SPAN lang=EN-US><FONT face=Arial>JVM</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">不得不说Q“先别动Q我惛_你现在的样子存一份快照,所以按时停止入栈和出栈操作Q笑着{我拍完快照吧。”栈跟踪不只包含q行时栈中的一两个元素Q而是包含q个栈中的每一个元素,从栈到栈底Q还有行号和一切应有的东西?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face=Arial>       </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">因此Q创建异常这一部分开销很大。从技术上Ԍ栈跟t快照是在本地方?/SPAN><SPAN lang=EN-US><FONT face=Arial>Throwable.fillInStackTrace()</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">中发生的Q这个方法不是从</SPAN><SPAN lang=EN-US><FONT face=Arial>Throwable contructor</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">那里调用的。但是这qƈ没有什么媄响——如果你创徏了一?/SPAN><SPAN lang=EN-US><FONT face=Arial>Exception</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q就得付Z仗好在捕获异常开销不大Q因此可以用</SPAN><SPAN lang=EN-US><FONT face=Arial>try-catch</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">核心内容包h。你也可以在Ҏ定义中定?/SPAN><SPAN lang=EN-US><FONT face=Arial>throws</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">子句Q这样对性能不会造成什么损失。从技术上Ԍ你甚臛_以随意地抛出异常Q而不用花费很大的代h。招致性能损失的ƈ不是</SPAN><SPAN lang=EN-US><FONT face=Arial>throw</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">操作——尽在没有预先创徏异常的情况下抛出异常是有点不寻常。真正要׃L是创建异常?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face=Arial>       </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">q运的是Q好的编E习惯已教会我们Q不应该不管三七二十一抛出异常。异常是为异常的情况而设计的Q用时也应该牢记这一原则。但是,万一你不想遵从好的编E习惯,</SPAN><SPAN lang=EN-US><FONT face=Arial>Java</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">语言׃让你知道Q那样就可以让你的程序运行的更快Q从而鼓׃去那样做?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>2) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>instanceof</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">替代?/SPAN><SPAN lang=EN-US><FONT face=Arial>try-catch</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">中做投机的强制类型{换方法;</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>3) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">可能少的用强制类型{换方法,其是用类型特定的集合cLQ?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>4) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">使用</SPAN><SPAN lang=EN-US><FONT face=Arial>int</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">优先于其他所有的数据cdQ?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>5) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">可能用基本数据类型做临时变量Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>6) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">考虑直接获取实例变量而不通过</SPAN><SPAN lang=EN-US><FONT face=Arial>get</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN><SPAN lang=EN-US><FONT face=Arial>set</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Ҏ获取Q注意:q不W合面向对象的封装原则,不推荐用)?/SPAN></P> <H2 style="MARGIN: 13pt 0cm"><A name=_Toc123372423><SPAN lang=EN-US><FONT face=Arial>3.4 </FONT></SPAN></A><SPAN style="mso-bookmark: _Toc123372423"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">循环Q选择和递归</SPAN></SPAN></H2> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>1) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">在@环中消除不必要的代码Q做可能少的事情;</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>2) Switch</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">语句中用连l的</SPAN><SPAN lang=EN-US><FONT face=Arial>case</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">|</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>3) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">定是否真的需要用到递归Q最好{为用循环来实现?/SPAN></P> <H2 style="MARGIN: 13pt 0cm"><A name=_Toc123372424><SPAN lang=EN-US><FONT face=Arial>3.5 </FONT></SPAN></A><SPAN style="mso-bookmark: _Toc123372424"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">输入输出操作</SPAN></SPAN></H2> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>1) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">在程序中量不要使用</SPAN><SPAN lang=EN-US><FONT face=Arial>System.out</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">q样的语句,而?/SPAN><SPAN lang=EN-US><FONT face=Arial>log4j</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">q样的日志工h换,以在E序正式上线的时候可以关闭所有不必要的日志操作提高性能Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>2) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">当程序中有大量的</SPAN><SPAN lang=EN-US><FONT face=Arial>I/O</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">操作Ӟ考虑日志写入不同的文g做到q行化操作以提高性能Qƈ可以用一个后台线E执?/SPAN><SPAN lang=EN-US><FONT face=Arial>I/O</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">操作而不打断正常E序的执行;</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>3) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">正确的用序列化机制Q没有必要序列化的成员变量需要标识ؓ</SPAN><SPAN lang=EN-US><FONT face=Arial>transient</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>4) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">使用</SPAN><SPAN lang=EN-US><FONT face=Arial>NIO</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">技术?/SPAN></P> <H2 style="MARGIN: 13pt 0cm"><A name=_Toc123372425><SPAN lang=EN-US><FONT face=Arial>3.6 JDBC</FONT></SPAN></A><SPAN lang=EN-US><FONT face=Arial> </FONT></SPAN></H2> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>1) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">使用正确?/SPAN><SPAN lang=EN-US><FONT face=Arial>JDBC</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">驱动Q尽可能地选择最新的</SPAN><SPAN lang=EN-US><FONT face=Arial>JDBC</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">驱动Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face=Arial>       </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">最新的</SPAN><SPAN lang=EN-US><FONT face=Arial>JDBC</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">驱动不仅优化了性能Q而且提供了更多的性能更好的接口供开发h员用?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>2) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">使用应用服务器自带的q接池,而不要用自qq接池或q脆不用q接池;</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>3) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">在用完数据库资源后Q需依次关闭</SPAN><SPAN lang=EN-US><FONT face=Arial>ResultSet</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN><SPAN lang=EN-US><FONT face=Arial>Statement</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>Connection</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>4) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">手动控制事务Q?/SPAN><SPAN lang=EN-US><FONT face=Arial>connection.setAutoCommit(false)</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">关闭自动提交Q?/SPAN><SPAN lang=EN-US><FONT face=Arial>executeBatch()</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">q行扚w更新Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>5) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">业务复杂或者大数据量操作时使用存储q程Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>6) ResultSet.next()</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">极其消耗性能Q徏议?/SPAN><SPAN lang=EN-US><FONT face=Arial>RowSet</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">替代</SPAN><SPAN lang=EN-US><FONT face=Arial>ResultSet</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>7) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">把所有的字符数据都保存ؓ</SPAN><SPAN lang=EN-US><FONT face=Arial>Unicode</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN><SPAN lang=EN-US><FONT face=Arial>Java</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>UniCode</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">形式处理所有数据,数据库驱动程序不必再执行转换q程Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>8) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">可能的优化</SPAN><SPAN lang=EN-US><FONT face=Arial>SQL</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">语句Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>9) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">用</SPAN><SPAN lang=EN-US><FONT face=Arial>join</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q多?/SPAN><SPAN lang=EN-US><FONT face=Arial>index</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>10) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">使用</SPAN><SPAN lang=EN-US><FONT face=Arial>EXPLAIN</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">工具监控</SPAN><SPAN lang=EN-US><FONT face=Arial>SQL</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">语句的执行,以确定瓶颈所在;</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>11)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT face=Arial> </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">不要使用</SPAN><SPAN lang=EN-US><FONT face=Arial> SELECT * ..., </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">使用</SPAN><SPAN lang=EN-US><FONT face=Arial> SELECT Field1, Field1 ...</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>12)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT face=Arial> </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">通过</SPAN><SPAN lang=EN-US><FONT face=Arial>index</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">获取字段Q而不要用名字去获取Q例?/SPAN><SPAN lang=EN-US><FONT face=Arial>resultSet.getString(1) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">而不?/SPAN><SPAN lang=EN-US><FONT face=Arial> resultSet.getString("field1")</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>13)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT face=Arial> </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">~存数据Q避免重复查询;</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>14)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT face=Arial> </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">考虑使用内存数据库;</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>15)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT face=Arial> </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">调整</SPAN><SPAN lang=EN-US><FONT face=Arial>fetch size</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">q行扚w查询Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>16)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT face=Arial> </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">可能的?/SPAN><SPAN lang=EN-US><FONT face=Arial>Java</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">数据cd和数据库cd相匹配,转换数据在匹配不好的数据cd间效率太差;</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>17)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">避免使用低效?/SPAN><SPAN lang=EN-US><FONT face=Arial>metadata</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">调用Q尤其是</SPAN><SPAN lang=EN-US><FONT face=Arial>getBestRowIdentifier( ), getColumns( ), getCrossReference( ), getExportedKeys( ), getImportedKeys( ), getPrimaryKeys( ), getTables( ), and getVersionColumns( )</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>18)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT face=Arial> </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">使用</SPAN><SPAN lang=EN-US><FONT face=Arial>metadata</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">查询减少数据库网l通信量;</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>19)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"></SPAN><SPAN style="mso-spacerun: yes"><FONT face=Arial> </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">使用最低的事务隔离U别Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>20)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT face=Arial> </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">使用乐观锁机Ӟ</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>21)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT face=Arial> </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">把应用服务器和数据库分散在不同的机器中,性能可能会更好?/SPAN></P> <H2 style="MARGIN: 13pt 0cm"><A name=_Toc123372426><SPAN lang=EN-US><FONT face=Arial>3.7 Servlet</FONT></SPAN></A><SPAN style="mso-bookmark: _Toc123372426"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>JSP</FONT></SPAN></SPAN></H2> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>1) Session</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的用;</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face=Arial>       </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">应用服务器保存很多会话时Q容易造成内存不Q所以尽量减?/SPAN><SPAN lang=EN-US><FONT face=Arial>Session</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的用,攄?/SPAN><SPAN lang=EN-US><FONT face=Arial>Session</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">中的对象不应该是大对象,最好是单的对象,实现串行化接口。当会话不再需要时Q应当及时调?/SPAN><SPAN lang=EN-US><FONT face=Arial>invalidate()</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Ҏ清除会话。而当某个变量不需要时Q及时调?/SPAN><SPAN lang=EN-US><FONT face=Arial>removeAttribute()</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Ҏ清除变量。当</SPAN><SPAN lang=EN-US><FONT face=Arial>session</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">l止旉要清除不必要的资源,实现</SPAN><SPAN lang=EN-US><FONT face=Arial>HttpSessionBindingListener</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">接口?/SPAN><SPAN lang=EN-US><FONT face=Arial>valueUnbound()</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Ҏ?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>2) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">使用</SPAN><SPAN lang=EN-US><FONT face=Arial>include directive</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q而不使用</SPAN><SPAN lang=EN-US><FONT face=Arial>include action</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face=Arial>       </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">目前?/SPAN><SPAN lang=EN-US><FONT face=Arial>JSP</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">面中引入外部资源的Ҏ主要有两U:</SPAN><SPAN lang=EN-US><FONT face=Arial>include directive</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>include action</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>Include directive</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q例?/SPAN><SPAN lang=EN-US><FONT face=Arial><%@ include file=”copyright.html?%></FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q该指o在编译时引入指定的资源。在~译之前Q带?/SPAN><SPAN lang=EN-US><FONT face=Arial>include</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">指o的页面和指定的资源被合ƈ成一个文件。被引用的资源在~译时就定Q比q行时才定资源更高效?/SPAN><SPAN lang=EN-US><FONT face=Arial>Include action</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q例?/SPAN><SPAN lang=EN-US><FONT face=Arial>< jsp:include page=”copyright.jsp?/></FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q该动作引入指定面执行后生成的l果。由于它在运行时完成Q因此对输出l果的控制更加灵zR但是,只有当引用的内容被频J改变时Q或者在对主面的请求没有出C前,被引用的面无法定Ӟ使用</SPAN><SPAN lang=EN-US><FONT face=Arial>include action</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">才合?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>3) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">对于那些无需跟踪会话状态的</SPAN><SPAN lang=EN-US><FONT face=Arial>jsp</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q关闭自动创建的会话可以节省一些资源。用如?/SPAN><SPAN lang=EN-US><FONT face=Arial>page</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">指oQ?/SPAN><SPAN lang=EN-US><FONT face=Arial> < %@ page session=”false?%></FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>4) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">量不要?/SPAN><SPAN lang=EN-US><FONT face=Arial>jsp</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">面定义为单U程Q应讄?/SPAN><SPAN lang=EN-US><FONT face=Arial>< %@page isThreadSafe=”true?%></FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>5) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>jsp</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">面最好用输出缓存功能,如:</SPAN><SPAN lang=EN-US><FONT face=Arial>< %@page buffer=?2kb?%></FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>6) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>servlet</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">之间跌{Ӟ</SPAN><SPAN lang=EN-US><FONT face=Arial>forward</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>sendRedirect</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">更有效;</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>7) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">讄</SPAN><SPAN lang=EN-US><FONT face=Arial>HttpServletResponse</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">~冲区,如:</SPAN><SPAN lang=EN-US><FONT face=Arial>response.setBufferSize(20000)</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-tab-count: 1">       </SPAN>8) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>servlet</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">里?/SPAN><SPAN lang=EN-US><FONT face=Arial>ServletOutputStream</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">输出囄{对象;</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=Arial>9) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">不要使用</SPAN><SPAN lang=EN-US><FONT face=Arial>SingleThreadModel</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q</SPAN><SPAN lang=EN-US><FONT face=Arial>Servlet</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">是线E安全的Q但是尽可能的减消耗在同步代码上的旉Q用够多?/SPAN><SPAN lang=EN-US><FONT face=Arial>servlet</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">d应用LhQ?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=Arial>10) </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">可能的?/SPAN><SPAN lang=EN-US><FONT face=Arial>useBean</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的范围在</SPAN><SPAN lang=EN-US><FONT face=Arial>page</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">范围内;</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>11)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN lang=EN-US><FONT face=Arial><SPAN style="mso-spacerun: yes"> </SPAN>Servlet</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>inti()</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>destroy()</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>jspInit()</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>jspDestroy()</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Ҏ用于创徏和删除昂늚资源Q例如缓存对象和数据库连接;</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>12)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT face=Arial> </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">避免使用反向</SPAN><SPAN lang=EN-US><FONT face=Arial>DNS</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">查找Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>13)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT face=Arial> </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">预编?/SPAN><SPAN lang=EN-US><FONT face=Arial>JSP</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">面Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>14)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT face=Arial> </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">可能的在客h校验数据Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>15)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT face=Arial> </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">止自动装蝲特色防止周期性的装蝲</SPAN><SPAN lang=EN-US><FONT face=Arial>servlet</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>jsp</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN></P> <H2 style="MARGIN: 13pt 0cm"><A name=_Toc123372427><SPAN lang=EN-US><FONT face=Arial>3.8 EJB</FONT></SPAN></A></H2> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face=Arial>       </FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">׃</SPAN><SPAN lang=EN-US><FONT face=Arial>EJB2.0</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">已经很少目在用了,</SPAN><SPAN lang=EN-US><FONT face=Arial>EJB3.0</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">再成熟一点,我再补充q一部分吧!</SPAN></P><img src ="http://www.tkk7.com/patrick/aggbug/25478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/patrick/" target="_blank">大狮子慢慢爬的Blog</a> 2005-12-26 18:28 <a href="http://www.tkk7.com/patrick/archive/2005/12/26/25478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>应用E序调优——对象创?/title><link>http://www.tkk7.com/patrick/archive/2005/12/25/25348.html</link><dc:creator>大狮子慢慢爬的Blog</dc:creator><author>大狮子慢慢爬的Blog</author><pubDate>Sun, 25 Dec 2005 01:40:00 GMT</pubDate><guid>http://www.tkk7.com/patrick/archive/2005/12/25/25348.html</guid><wfw:comment>http://www.tkk7.com/patrick/comments/25348.html</wfw:comment><comments>http://www.tkk7.com/patrick/archive/2005/12/25/25348.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/patrick/comments/commentRss/25348.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/patrick/services/trackbacks/25348.html</trackback:ping><description><![CDATA[<H2 style="MARGIN: 13pt 0cm"><SPAN lang=EN-US><FONT face=Arial>3.1 </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">对象创徏</SPAN></H2> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">对象的创建是一个非常昂늚工作Q而由于对象的创徏而导致经常性的垃圾攉则是一个更加消耗时间和</SPAN><SPAN lang=EN-US><FONT face=Arial>CPU</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的操作。我们在~码Ӟ应当量的减对象的创徏。不要在l常被执行的代码中创建对象;使用集合对象时最好预先分配其大小Q当一?/SPAN><SPAN lang=EN-US><FONT face=Arial>class</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的多个实例都需要获取某个对象时Q最好能标记那个对象</SPAN><SPAN lang=EN-US><FONT face=Arial>static</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q当不需?/SPAN><SPAN lang=EN-US><FONT face=Arial>stack trace</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">时尽可能的重用异常实例等{都能很有效的避免对象创导致的额外的开销。下面是一些常用的有效的策略:</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="COLOR: blue; mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>1)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">      </SPAN></SPAN></SPAN><SPAN style="COLOR: blue; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">对象池技?/SPAN><SPAN lang=EN-US style="COLOR: blue"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>Java</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">中开发一个普遍性的对象池架构可以更好地利用资源Qƈ可以使对象创建的成本降到最。大多数人对直接或间接运用对象池来连接一个数据库都很熟悉。但通常你也可以对象放入对象池中从而节省重要的资源、提高程序的效率q控制对不充源的讉K。出于对设计、成本或性能的考虑Q放入对象池中的对象通常是有限的。它们或者是初始化成本很高的对象Q或者是很少用的对象。运用对象池我们可以理竞争性客LҎ限的对象集的讉K?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">对象池主要是可以更好地运用你的资源。例如,设想有相当多的客戯有效q用很少的数据库q接或网l连接。通过限制对对象的讉KQ只在客L需要的时候才能访问对象)Q你可以释放资源,让其它客L使用。通过对象池提高对象的利用率通常可以提高pȝ的性能?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">你可以用对象池使初始化的成本达到最。典型的例子包括数据库、网l连接和U程。这Lq接通常需要很多时间来初始化。一旦创Zq些q接Q你可以重用它们,从而极大地节省了成本。因此,你可以将初始化成本很高(从时间、内存或其它资源斚w考虑Q的对象攑օ对象池中。例如,大多数容器都?/SPAN><SPAN lang=EN-US><FONT face=Arial>EJB</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">攑օ对象池中Q从而避免重复的资源分配和状态初始化?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">一个设计良好的对象池架构具有普遍性,它适合不同应用E序的需要。可以让你控制对象池的容量、对象填充策略和对象状态。它可以极大地提高你的应用程序的效率Q不从速度斚w考虑Q还是从资源利用率方面考虑Q该架构都可以提供这L好处?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">在这里,l大家推荐一个开源的目</SPAN><SPAN lang=EN-US><FONT face=Arial>Commons-Pool</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN><SPAN lang=EN-US><A ><FONT face=Arial>http://jakarta.apache.org/commons/pool/</FONT></A></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q,我还没来得及研究Q谁用过了,感觉好的Q麻烦告诉我一下,谢谢Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="COLOR: blue; mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>2)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">      </SPAN></SPAN></SPAN><SPAN lang=EN-US style="COLOR: blue"><FONT face=Arial>ThreadLocal</FONT></SPAN><SPAN style="COLOR: blue; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">技?/SPAN><SPAN lang=EN-US style="COLOR: blue"><o:p></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">使用此技术获取线E绑定的带状态的单例对象?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="COLOR: blue; mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>3)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">      </SPAN></SPAN></SPAN><SPAN style="COLOR: blue; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">单例模式</SPAN><SPAN lang=EN-US style="COLOR: blue"><o:p></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">通过单例模式或定义对象</SPAN><SPAN lang=EN-US><FONT face=Arial>static</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">来得对象的实例只能有一个ƈ被其他对象所׃n?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="COLOR: blue; mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>4)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">      </SPAN></SPAN></SPAN><SPAN style="COLOR: blue; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">枚D帔R</SPAN><SPAN lang=EN-US style="COLOR: blue"><o:p></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">使用整数取代字符串作为枚丑ָ量,比如</SPAN><SPAN lang=EN-US><FONT face=Arial>FEMALE</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>MALE</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">我们可以用整?/SPAN><SPAN lang=EN-US><FONT face=Arial>1</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US><FONT face=Arial>2</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">来替代。这样将带来速度上和内存上的优势?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="COLOR: blue; mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>5)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">      </SPAN></SPAN></SPAN><SPAN style="COLOR: blue; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">使用</SPAN><SPAN lang=EN-US style="COLOR: blue"><FONT face=Arial>SoftReference</FONT></SPAN><SPAN style="COLOR: blue; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN><SPAN lang=EN-US style="COLOR: blue"><FONT face=Arial>WeakReference</FONT></SPAN><SPAN style="COLOR: blue; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">?/SPAN><SPAN lang=EN-US style="COLOR: blue"><FONT face=Arial>PhantomReference</FONT></SPAN><SPAN style="COLOR: blue; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">引用c?/SPAN><SPAN lang=EN-US style="COLOR: blue"><o:p></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">引用cȝ主要功能是能够引用仍可以被垃圾攉器回收的对象。在引入引用cM前,我们只能使用强引用(</SPAN><SPAN lang=EN-US><FONT face=Arial>Strong Reference</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q。例?/SPAN><SPAN lang=EN-US><FONT face=Arial>obj</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">q个引用引用堆中存储的一个对象,只要</SPAN><SPAN lang=EN-US><FONT face=Arial>obj</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">引用q存在,垃圾攉器就永远不会释放用来容纳该对象的存储I间。当</SPAN><SPAN lang=EN-US><FONT face=Arial>obj</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">出范围或被昑ּ指定?/SPAN><SPAN lang=EN-US><FONT face=Arial>null</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Ӟ垃圾攉器就认ؓ没有对这个对象的其他引用Q也可以收集它了。然而还需要注意一个重要的l节Q仅凭对象可以被攉q不意味着垃圾攉器的一ơ指定运行就能够回收它。由于各U垃圾收集算法不同,某些法会更频繁地分析生存期较短的对象,而不是较老、生存期较长的对象。因此,一个可供收集的对象可能永远也不会被回收。如果程序在垃圾攉器释攑֯象之前结束,q种情况可能会出现。因此,概括地说Q你永远无法保证可供攉的对象L会被垃圾攉器收集?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">让我们来看看一些术语和定义Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">强可及对象(</SPAN><SPAN lang=EN-US><FONT face=Arial>Strongly Reachable</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q:可以通过强引用访问的对象?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">软可及对象(</SPAN><SPAN lang=EN-US><FONT face=Arial>Softly Reachable</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q:不是强可及对象,q且能够通过软引用访问的对象?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">弱可及对象(</SPAN><SPAN lang=EN-US><FONT face=Arial>Weakly Reachable</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q:不是强可及对象也不是软可及对象,q且能够通过弱引用访问的对象?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">虚可及对象(</SPAN><SPAN lang=EN-US><FONT face=Arial>Phantomly Reachable</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q:不是强可及对象、Y可及对象Q也不是弱可及对象,已经l束的,可以通过虚引用访问的对象?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">清除Q将引用对象?/SPAN><SPAN lang=EN-US><FONT face=Arial>refernce</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">域设|ؓ</SPAN><SPAN lang=EN-US><FONT face=Arial>null</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Qƈ引用类在堆中引用的对象声明为可l束的?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=Arial>SoftReference</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">c:</SPAN><SPAN lang=EN-US><FONT face=Arial>SoftReference</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">cȝ一个典型用途就是用于内存敏感的高速缓存?/SPAN><SPAN lang=EN-US><FONT face=Arial>SoftReference</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的原理是Q在保持对对象的引用时保证在</SPAN><SPAN lang=EN-US><FONT face=Arial>JVM</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">报告内存不情况之前清楚所有的软引用。关键之处在于,垃圾攉器在q行时可能会Q也可能不会Q释放Y可及对象。对象是否被是否取决于垃圾收集器的算法以及垃圾收集器q行时可用的内存数量?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=Arial>WeakReference</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">c:</SPAN><SPAN lang=EN-US><FONT face=Arial>WeakReference</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">cȝ一个典型用途就是规范化映射Q?/SPAN><SPAN lang=EN-US><FONT face=Arial>Canonicalized Mapping</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q。另外,对于那些生存期相对较长而且重新创徏的开销也不高的对象来说Q弱引用也比较有用。关键之处在于,垃圾攉器运行时如果到了弱可及对象Q将释放</SPAN><SPAN lang=EN-US><FONT face=Arial> WeakReference </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">引用的对象。然而,h意,垃圾攉器可能要q行多次才能扑ֈq攑ּ可及对象?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt"><SPAN lang=EN-US><FONT face=Arial>PhantomReference</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">c:</SPAN><SPAN lang=EN-US><FONT face=Arial>PhantomReference </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">cd能用于跟t对被引用对象即进行的攉。同P它还能用于执?/SPAN><SPAN lang=EN-US><FONT face=Arial> pre-mortem </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">清除操作?/SPAN><SPAN lang=EN-US><FONT face=Arial> PhantomReference </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">必须?/SPAN><SPAN lang=EN-US><FONT face=Arial> ReferenceQueue </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">cM起用。需?/SPAN><SPAN lang=EN-US><FONT face=Arial> ReferenceQueue </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">是因为它能够充当通知机制。当垃圾攉器确定了某个对象是虚可及对象Ӟ</SPAN><SPAN lang=EN-US><FONT face=Arial> PhantomReference </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">对象p攑֜它的</SPAN><SPAN lang=EN-US><FONT face=Arial> ReferenceQueue </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">上。将</SPAN><SPAN lang=EN-US><FONT face=Arial> PhantomReference </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">对象攑֜</SPAN><SPAN lang=EN-US><FONT face=Arial> ReferenceQueue </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">上也是一个通知Q表?/SPAN><SPAN lang=EN-US><FONT face=Arial> PhantomReference </FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">对象引用的对象已l结束,可供攉了。这使您能够刚好在对象占用的内存被回收之前采取行动?/SPAN><SPAN lang=EN-US><FONT face=Arial> </FONT></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">在某些场合引用类q是很有用的Q具体可以参考文?/SPAN><SPAN lang=EN-US><FONT face=Arial>Java2</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">引用cM用指南(</SPAN><SPAN lang=EN-US><A ><FONT face=Arial>http://www-128.ibm.com/developerworks/cn/java/j-refs/index.html</FONT></A></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">Q?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="COLOR: blue; mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>6)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">      </SPAN></SPAN></SPAN><SPAN style="COLOR: blue; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">可能少的减不必要对象的生?/SPAN><SPAN lang=EN-US style="COLOR: blue"><o:p></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">可能减在循环中创建对象,使用</SPAN><SPAN lang=EN-US><FONT face=Arial>StringBuffer</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">而不要?/SPAN><SPAN lang=EN-US><FONT face=Arial>String</FONT></SPAN><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">来做q接操作{等?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="COLOR: blue; mso-fareast-font-family: Arial; mso-bidi-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>7)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">      </SPAN></SPAN></SPAN><SPAN style="COLOR: blue; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">改变对象的创建时?/SPAN><SPAN lang=EN-US style="COLOR: blue"><o:p></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">通过提前创徏对象或gq到使用时再创徏对象Q来做到性能优化和避免创多的对象?/SPAN></P><img src ="http://www.tkk7.com/patrick/aggbug/25348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/patrick/" target="_blank">大狮子慢慢爬的Blog</a> 2005-12-25 09:40 <a href="http://www.tkk7.com/patrick/archive/2005/12/25/25348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>性能调优的基本知识和JDK调优http://www.tkk7.com/patrick/archive/2005/12/22/25117.html大狮子慢慢爬的Blog大狮子慢慢爬的BlogThu, 22 Dec 2005 11:28:00 GMThttp://www.tkk7.com/patrick/archive/2005/12/22/25117.htmlhttp://www.tkk7.com/patrick/comments/25117.htmlhttp://www.tkk7.com/patrick/archive/2005/12/22/25117.html#Feedback21http://www.tkk7.com/patrick/comments/commentRss/25117.htmlhttp://www.tkk7.com/patrick/services/trackbacks/25117.html 

基本知识

1.1 性能是什?/SPAN>

在性能调优之前Q我们首先来了解一下性能是什么?关于性能Q我x个学习过Java的h都能列出几点Q甚臛_以夸夸其谈。在?/SPAN>Java TM Platform Performance》(注:我有此书的电子版Q有需要者可以和我联p?/SPAN>Q一书中Q定义了如下五个斚w来作判性能的标准:

1)      q算的性能——哪一个算法的执行性能最好?

2)      内存的分配——程序运行时需要耗费多少内存Q?/SPAN>

3)      启动的时间——程序启动需要多长时_q在Web目中的影响不大Q但要注意部分程序需要部|或q行在客L时的情ŞQ比?/SPAN>appletE序Q?/SPAN>

4)      E序的可伸羃性——在压力负蝲的情况下Q程序的性能如何Q?/SPAN>

5)      性能的感知——用户在什么情况下会觉得程序的性能不好Q?/SPAN>

以上五个斚wQ在具体的用场景可以有选择的去评判。至于这五方面的性能调优Q在后箋的章节中会陆箋的给以相应的性能调优{略?/SPAN>

1.2 调优的规?/SPAN>

我们只需要关心对我们E序有媄响,可以察觉到的性能问题Q而不是每一个类中的每一个方法我们都需要想方设法的提高性能。如果程序的性能没有辑ֈ我们所期望的要求,我们才需要考虑如何优化性能。同LQ晦涩的代码虽然提高了程序的性能Q但同时可能带给我们的是l护的噩梦。我们需要折中的考虑以上两种情况Q得程序的代码是优的Qƈ且运行的_快,辑ֈ客户所期望的性能要求?/SPAN>

优化代码甚至会导致不良的l果Q?/SPAN>Donald KnuthQ一位比较牛比较有媄响的人物Q具体是谁,我也忘了Q谁知道Q可以告诉我一下,谢谢Q)曾说q,?/SPAN>Premature optimization is the root of all evil?/FONT>。在开始性能调优前,需要先指出不优化代码的一些理由?/SPAN>

1)      如果优化的代码已l正常工作,优化后可能会引入新的bugQ?/SPAN>

2)      优化代码向于代码更难理解和维护;

3)      在一个^C优化的代码,在另一个^C可能更糟Q?/SPAN>

4)      p很多旉在代码的优化上,提高了很的性能Q却D了晦涩的代码?/SPAN>

实Q在优化前,我们必须认真的考虑是否值得M化?/SPAN>

1.3 调优的步?/SPAN>

一般我们提高应用程序的性能划分Z下几个步骤:

1)      明确应用E序的性能指标Q怎样才符合期望的性能需求;

2)      在目标^台进行测试;

3)      如果性能已经辑ֈ性能指标Q?/SPAN>StopQ?/SPAN>

4)      查找性能瓉Q?/SPAN>

5)      修改性能瓉Q?/SPAN>

6)      q回到第2步?/SPAN>

?/SPAN> JDK调优

2.1 选择合适的JDK版本

不同版本?/SPAN>JDKQ甚至不同厂家的JDK可能都存在着很大的差异,对于性能优化的程度不同。一般来_可能选择最新发布的E_?/SPAN>JDK版本。最新的E_?/SPAN>JDK版本相对以前?/SPAN>JDK版本都会做一?/SPAN>bug的修改和性能的优化工作?/SPAN>

2.2 垃圾攉Java堆的优化

垃圾攉是自动释放不再被程序所使用的对象的q程。当一个对象不再被E序所引用Ӟ它所引用的堆I间可以被回Ӟ以便被后l的新对象所使用。垃圾收集器必须能够断定哪些对象是不再被引用的,q且能够把它们所占据的堆I间释放出来。如果对象不再被使用Q但q有被程序所引用Q这时是不能被垃圾收集器所回收的,此时是所谓的“内存泄漏”。监控应用程序是否发生了内存泄漏Q有一个非怼U的监控工h荐给大家—?/SPAN>Quest公司?/SPAN>JProbe工具Q用它来观察程序运行期的内存变化,q可产生内存快照Q从而分析ƈ定位内存泄漏的确切位|,可以_定位到源码内。这个工L使用我在后箋的章节中q会做具体介l?/SPAN>

Java堆是指在E序q行时分配给对象生存的空间。通过-mx/-Xmx?/SPAN>-ms/-Xms来设|v始堆的大和最大堆的大。根据自?/SPAN>JDK的版本和厂家军_使用-mx?/SPAN>-ms?/SPAN>-Xmx?/SPAN>-Xms?/SPAN>Java堆大决定了垃圾回收的频度和速度Q?/SPAN>Java堆越大,垃圾回收的频度越低,速度慢。同理,Java堆越,垃圾回收的频度越高,速度快。要惌|比较理想的参数Q还是需要了解一些基知识的?/SPAN>

Java堆的最大g能太大,q样会造成pȝ内存被频J的交换和分c所以最大内存必M于物理内存减d他应用程序和q程需要的内存。而且堆设|的太大Q造成垃圾回收的时间过长,q样得不偿失,极大的媄响程序的性能。以下是一些经怋用的参数讄Q?/SPAN>

1)      -Xms{于-XmX的|

2)      估计内存中存zd象所占的I间的大,讄-Xms{于此|-Xmx四倍于此|

3)      -Xms{于-Xmx?/SPAN>1/2大小Q?/SPAN>

4)      -Xms介于-Xmx?/SPAN>1/10?/SPAN>1/4之间Q?/SPAN>

5)      使用默认的设|?/SPAN>

大家需要根据自qq行E序的具体用场景,来确定最适合自己的参数设|?/SPAN>

除了-Xms?/SPAN>-Xmx两个最重要的参数外Q还有很多可能会用到的参敎ͼq些参数通常强烈的依赖于垃圾攉的算法,所以可能因?/SPAN>JDK的版本和厂家而有所不同。但q些参数一般在Web开发中用的比较,我就不做详细介绍了。在实际的应用中注意讄-Xms?/SPAN>-Xmx使其可能的优化应用E序p了。对于性能要求很高的程序,需要自己再多研I研I?/SPAN>Java虚拟机和垃圾攉法的机制了。可以看看曹晓钢译的《深?/SPAN>Java虚拟机》一书?/SPAN>

 



]]>
վ֩ģ壺 ޾ƷۺϾþþþý| С˵ۺͼ| 99þþùƷţţĴ| ŮƵۿ| ŷ޾Ʒһѿ | ѿAVëƬһ| Դ̼ƬƵ| ҰƵ| ƵѴȫϼ| ѿ۳ҹվ| ڵƵ߹ۿ | 8888ɫ߹ۿѿ| ѹۿ߹ۿİ| 91ƷѸ| ѹۿɫƵվ(ɫ) | 9ȾƷѹۿƵ| ƬѸ| ձ˳ƵѲ| ƷվƵ| ѵӰվ| ѻɫëƬƵ| AV߹ۿ| Ļþۺ| ޢva| ˳վ18ֹþӰԺ | ޳վ| ɬɬɫۺ| Ʒav벻| jizz߹ۿ| Ʒһvr| 91Ƶ߹ۿѴȫ| СƵ߹ۿ| ҹ侫Ʒպ| ޾Ʒþþþþþþþþþ| þþŷղũ| һ߹ۿ | һþþþþþþ| ڵһ | Ʒۺҹҹ| ɫҳѹۿ| þWWW˳һƬ|