高性能、高弹性JSP和Servlet性能优化(1)(2)
方法四:使用gzip压缩
压缩是删除冗余信息的作法,用尽可能小的空间描述你的信息。使用gzip(GNU zip)压缩文档能有效地减少下载HTML文件的时间。你的信息量越小,它们被送出的速度越快。因此,如果你压缩了由你web应用产生的内容,它到达用户并显示在用户屏幕上的速度就越快。不是任何浏览器都支持gzip压缩的,但检查一个浏览器是否支持它并发送gzip压缩内容到浏览器是很容易的事情。下边的代码段说明了如何发送压缩的内容。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { OutputStream out = null // Check the Accepting-Encoding header from the HTTP request. // If the header includes gzip, choose GZIP. // If the header includes compress, choose ZIP. // Otherwise choose no compression. String encoding = request.getHeader("Accept-Encoding"); if (encoding != null && encoding.indexOf("gzip") != -1) { response.setHeader("Content-Encoding" , "gzip"); out = new GZIPOutputStream(response.getOutputStream()); } else if (encoding != null && encoding.indexOf("compress") != -1) { response.setHeader("Content-Encoding" , "compress"); out = new ZIPOutputStream(response.getOutputStream()); } else { out = response.getOutputStream(); } ... ... } |
方法五:不要使用SingleThreadModel
SingleThreadModel保证servlet一次仅处理一个请求。如果一个servlet实现了这个接口,servlet引擎将为每个新的请求创建一个单独的servlet实例,这将引起大量的系统开销。如果你需要解决线程安全问题,请使用其他的办法替代这个接口。SingleThreadModel在Servlet 2.4中是不再提倡使用。
方法六:使用线程池
servlet引擎为每个请求创建一个单独的线程,将该线程指派给service()方法,然后在service()方法执行完后删除该线程。默认情况下,servlet引擎可能为每个请求创建一个新的线程。由于创建和删除线程的开销是很昂贵的,于是这种默认行为降低了系统的性能。我们可以使用线程池来提高性能。根据预期的并发用户数量,配置一个线程池,设置好线程池里的线程数量的最小和最大值以及增长的最小和最大值。起初,servlet引擎创建一个线程数与配置中的最小线程数量相等的线程池。然后servlet引擎把池中的一个线程指派给一个请求而不是每次都创建新的线程,完成操作之后,servlet引擎把线程放回到线程池中。使用线程池,性能可以显著地提高。如果需要,根据线程的最大数和增长数,可以创建更多的线程。
方法七:选择正确的包括机制
在JSP页面中,有两中方式可以包括文件:包括指令(< %@ include file="test.jsp" %>)和包括动作(< jsp:include page="test.jsp" flush="true" />)。包括指令在编译阶段包括一个指定文件的内容;例如,当一个页面编译成一个servlet时。包括动作是指在请求阶段包括文件内容;例如,当一个用户请求一个页面时。包括指令要比包括动作快些。因此除非被包括的文件经常变动,否则使用包括指令将会获得更好的性能。
方法八:在useBean动作中使用合适的范围
使用JSP页面最强大方式之一是和JavaBean组件协同工作。JavaBean使用<jsp:useBean>标签可以嵌入到JSP页面中。语法如下:
<jsp:useBean id="name" scope="page|request|session|application" class= "package.className" type="typeName"> </jsp:useBean> |
scope属性说明了bean的可见范围。scope属性的默认值是page。你应该根据你应用的需求选择正确的范围,否则它将影响应用的性能。
例如,如果你需要一个专用于某些请求的对象,但是你把范围设置成了session,那么那个对象将在请求结束之后还保留在内存中。它将一直保留在内存中除非你明确地把它从内存中删除、使session无效或session超时。如果你没有选择正确的范围属性,由于内存和垃圾收集的开销将会影响性能。因此为对象设置合适的范围并在用完它们之后立即删除。
- 漫谈Java程序的性能优化
- ASP.NET如何进行性能优化问题
- Hibernate程序性能优化的考虑要点
用户点评