方法 : 使用线程池
应用服务器缺省地为每个不同的客户端请求创建一个线程进行处理并为它们分派service()方法当service()方法调用完成后与之相应的线程也随之撤消由于创建和撤消线程会耗费一定的系统资源这种缺省模式降低了系统的性能但所幸的是我们可以通过创建一个线程池来改变这种状况
另外我们还要为这个线程池设置一个最小线程数和一个最大线程数在应用服务器启动时它会创建数量等于最小线程数的一个线程池当客户有请求时相应地从池从取出一个线程来进行处理当处理完成后再将线程重新放入到池中
如果池中的线程不够地话系统会自动地增加池中线程的数量但总量不能超过最大线程数通过使用线程池当客户端请求急剧增加时系统的负载就会呈现的平滑的上升曲线从而提高的系统的可伸缩性
方法 : 选择正确的页面包含机制
在JSP中有两种方法可以用来包含另一个页面
使用include指示符(<%@ includee file=testjsp %>)
使用jsp指示符(<jsp:includee page=testjsp flush=true/>)
在实际中我发现如果使用第一种方法的话可以使得系统性能更高
方法 :正确地确定javabean的生命周期
JSP的一个强大的地方就是对javabean的支持通过在JSP页面中使用<jsp:useBean>标签可以将javabean直接插入到一个JSP页面中它的使用方法如下
<jsp:useBean id=name
scope=page|request|session|application
class=
packageclassName type=typeName>
</jsp:useBean>
其中scope属性指出了这个bean的生命周期缺省的生命周期为page如果你没有正确地选择bean的生命周期的话它将影响系统的性能
举例来说如果你只想在一次请求中使用某个bean但你却将这个bean的生命周期设置成了session那当这次请求结束后这个bean将仍然保留在内存中除非session超时或用户关闭浏览器这样会耗费一定的内存并无谓的增加了JVM垃圾收集器的工作量因此为bean设置正确的生命周期并在bean的使命结束后尽快地清理它们会使用系统性能有一个提高
其它一些有用的方法
在字符串连接操作中尽量不使用+操作符在java编程中我们常常使用+操作符来将几个字符串连接起来但你或许从来没有想到过它居然会对系统性能造成影响吧?由于字符串是常量因此JVM会产生一些临时的对像你使用的+越多生成的临时对像就越多这样也会给系统性能带来一些影响解决的方法是用StringBuffer对像来代替+操作符
避免使用Systemoutprintln()方法由于Systemoutprintln()是一种同步调用即在调用它时磁盘I/O操作必须等待它的完成因此我们要尽量避免对它的调用但我们在调试程序时它又是一个必不可少的方便工具为了解决这个矛盾我建议你最好使用Logj工具它既可以方便调试而不会产生Systemoutprintln()这样的方法
ServletOutputStream 与 PrintWriter的权衡:使用PrintWriter可能会带来一些小的开销因为它将所有的原始输出都转换为字符流来输出因此如果使用它来作为页面输出的话系统要负担一个转换过程而使用ServletOutputStream作为页面输出的话就不存在一个问题但它是以二进制进行输出的因此在实际应用中要权衡两者的利弊
总结
本文的目的是通过对servlet和JSP的一些调优技术来极大地提高你的应用程序的性能并因此提升整个JEE应用的性能通过这些调优技术你可以发现其实并不是某种技术平台(比如JEE和NET之争)决定了你的应用程序的性能重要是你要对这种平台有一个较为深入的了解这样你才能从根本上对自己的应用程序做一个优化!
[] []