Java Web性能优化
转载:http://hi.baidu.com/jiaqiang_22/item/c13dc2ac7d360a3c020a4d76
你时常被客户抱怨JSP页面响应速度很慢吗?你想过当客户访问次数剧增时,你的WEB应用能承受日益增加的访问量吗?呵呵下面讲述了调整JSP和servlet的一些非常实用的方法,它可使你的servlet和JSP页面响应更快,扩展性更强。而且在用户数增加的情况下,系统负载会呈现出平滑上长的趋势。在阅读之前,假设你有基本的servlet和JSP的知识,和一定的Java Web开发经验。
方法1:在servlet的init()方法中缓存数据 当应用服务器初始化servlet实例之后,为客户端请求提供服务之前,它会调用这个servlet的init()方法。在一个servlet的生命周期中,init()方法只会被调用一次。通过在init()方法中缓存一些静态的数据或完成一些只需要执行一次的、耗时的操作,就可大大地提高系统性能。 例如,通过在init()方法中建立一个JDBC连接池是一个最佳例子,假设我们是用jdbc2.0的DataSource接口来取得数据库连接,在通常的情况下,我们需要通过JNDI来取得具体的数据源。我们可以想象在一个具体的应用中,如果每次SQL请求都要执行一次JNDI查询的话,那系统性能将会急剧下降。解决方法是如下代码:
import javax.sql.*;public class ControllerServlet extends HttpServlet{
DataSource testDS = null;
public void init(ServletConfig config) throws ServletException {
super.init(config);
Context ctx = null;
try {
ctx = new InitialContext();
testDS = (DataSource)ctx.lookup("jdbc/testDS");
} catch(NamingException ne) {
ne.printStackTrace(); } catch(Exception e) {
e.printStackTrace(); }
} public DataSource getTestDS() {
return testDS; }
...... .....
.}
方法 2:禁止servlet和JSP 自动重载(auto-reloading) Servlet/JSP提供了一个实用的技术,即自动重载技术,它为开发人员提供了一个好的开发环境,当你改变servlet和JSP页面后而不必重启应用服务器。然而,这种技术在产品运行阶段对系统的资源是一个极大的损耗,因为它会给JSP引擎的类装载器(classloader)带来极大的负担。因此关闭自动重载功能对系统性能的提升是一个极大的帮助。
server.xml中有个选项autoDeploy改为false,再看看context中reloadable是否设为true了(应该设置为false,默认是false)。
方法 3: 不要滥用HttpSession 在很多应用中,我们的程序需要保持客户端的状态,以便页面之间可以相互联系。但不幸的是由于HTTP具有天生无状态性,从而无法保存客户端的状态。因此一般的应用服务器都提供了session来保存客户的状态。在JSP应用服务器中,是通过HttpSession对像来实现session的功能的,但在方便的同时,它也给系统带来了不小的负担。因为每当你获得或更新session时,系统者要对它进行费时的序列化操作。你可以通过对HttpSession的以下几种处理方式来提升系统的性能:
1) 如果没有必要,就应该关闭JSP页面中对HttpSession的缺省设置: 如果你没有明确指定的话,每个JSP页面都会缺省地创建一个HttpSession。如果你的JSP中不需要使用session的话,那可以通过如下的JSP页面指示符来禁止它:<%@ page session="false"%>
2)不要在HttpSession中存放大的数据对像:如果你在HttpSession中存放大的数据对像的话,每当对它进行读写时,应用服务器都将对其进行序列化,从而增加了系统的额外负担。你在HttpSession中存放的数据对像越大,那系统的性能就下降得越快。
3)当你不需要HttpSession时,尽快地释放它:当你不再需要session时,你可以通过调用HttpSession.invalidate()方法来释放它。
4)尽量将session的超时时间设得短一点:在JSP应用服务器中,有一个缺省的session的超时时间。当客户在这个时间之后没有进行任何操作的话,系统会将相关的session自动从内存中释放。超时时间设得越大,系统的性能就会越低,因此最好的方法就是尽量使得它的值保持在一个较低的水平。
方法 4: 将页面输出进行压缩 压缩是解决数据冗余的一个好的方法,特别是在网络带宽不够发达的今天。有的浏览器支持gzip(GNU zip)进行来对HTML文件进行压缩,这种方法可以戏剧性地减少HTML文件的下载时间。因此,如果你将servlet或JSP页面生成的HTML页面进行压缩的话,那用户就会觉得页面浏览速度会非常快。但不幸的是,不是所有的浏览器都支持gzip压缩,但你可以通过在你的程序中检查客户的浏览器是否支持它。下面就是关于这种方法实现的一个代码片段:
public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException{
OutputStream out = null
String encoding = request.getHeader("Accept-Encoding");
if (encoding != null && encoding.indexOf("gzip") != -1) {
request.setHeader("Content-Encoding" , "gzip");
out = new GZIPOutputStream(request.getOutputStream());
}else if (encoding != null && encoding.indexOf("compress") != -1) {
request.setHeader("Content-Encoding" , "compress");
out = new ZIPOutputStream(request.getOutputStream());
}else {
out = request.getOutputStream();
} ......
......}
方法5: 使用线程池 应用服务器缺省地为每个不同的客户端请求创建一个线程进行处理,并为它们分派service()方法,当service()方法调用完成后,与之相应的线程也随之撤消。由于创建和撤消线程会耗费一定的系统资源,这种缺省模式降低了系统的性能。但所幸的是我们可以通过创建一个线程池来改变这种状况。另外,我们还要为这个线程池设置一个最小线程数和一个最大线程数。在应用服务器启动时,它会创建数量等于最小线程数的一个线程池,当客户有请求时,相应地从池从取出一个线程来进行处理,当处理完成后,再将线程重新放入到池中。如果池中的线程不够地话,系统会自动地增加池中线程的数量,但总量不能超过最大线程数。通过使用线程池,当客户端请求急剧增加时,系统的负载就会呈现的平滑的上升曲线,从而提高的系统的可伸缩性。
方法 6: 选择正确的页面包含机制 在JSP中有两种方法可以用来包含另一个页面:1、使用include指示符(<%@ includee file=”test.jsp” %>)。2、使用jsp指示符(<jsp:includee page=”test.jsp” flush=”true”/>)。在实际中我发现,如果使用第一种方法的话,可以使得系统性能更高。
方法 7:正确地确定javabean的生命周期 JSP的一个强大的地方就是对javabean的支持。通过在JSP页面中使用<jsp:useBean>标签,可以将javabean直接插入到一个JSP页面中。它的使用方法如下:
<jsp:useBean id="name" scope="page|request|session|application" class="package.className" type="typeName"></jsp:useBean>
其中scope属性指出了这个bean的生命周期。缺省的生命周期为page。如果你没有正确地选择bean的生命周期的话,它将影响系统的性能。 举例来说,如果你只想在一次请求中使用某个bean,但你却将这个bean的生命周期设置成了session,那当这次请求结束后,这个bean将仍然保留在内存中,除非session超时或用户关闭浏览器。这样会耗费一定的内存,并无谓的增加了JVM垃圾收集器的工作量。因此为bean设置正确的生命周期,并在bean的使命结束后尽快地清理它们,会使用系统性能有一个提高。
其它一些有用的方法
在字符串连接操作中尽量不使用“+”操作符:在java编程中,我们常常使用“+”操作符来将几个字符串连接起来,但你或许从来没有想到过它居然会对系统性能造成影响吧?由于字符串是常量,因此JVM会产生一些临时的对像。你使用的“+”越多,生成的临时对像就越多,这样也会给系统性能带来一些影响。解决的方法是用StringBuffer对像来代替“+”操作符。
避免使用System.out.println()方法:由于System.out.println()是一种同步调用,即在调用它时,磁盘I/O操作必须等待它的完成,因此我们要尽量避免对它的调用。但我们在调试程序时它又是一个必不可少的方便工具,为了解决这个矛盾,我建议你最好使用Log4j工具(http://Jakarta.apache.org ),它既可以方便调试,而不会产生System.out.println()这样的方法。
ServletOutputStream 与 PrintWriter的权衡:使用PrintWriter可能会带来一些小的开销,因为它将所有的原始输出都转换为字符流来输出,因此如果使用它来作为页面输出的话,系统要负担一个转换过程。而使用ServletOutputStream作为页面输出的话就不存在一个问题,但它是以二进制进行输出的。因此在实际应用中要权衡两者的利弊。
相关推荐
Java Web开发是一个涵盖广泛的主题,包括使用Java语言进行服务器端编程、构建动态网站以及实现企业级应用...在实际开发过程中,还需要熟悉版本控制工具(如Git)、持续集成/持续部署(CI/CD)流程以及性能优化等技能。
#### 四、性能优化与扩展 - **缓存技术**:介绍不同类型的缓存机制,如内存缓存、分布式缓存等,并探讨其在提高系统响应速度方面的应用。 - **负载均衡**:讲解负载均衡的概念及其在高并发场景下的重要性,同时提供...
`java-property-utils-1.9.1.jar` 和 `java-property-utils-1.10.jar` 的差异可能体现在功能增强、性能优化、错误修复或者API变更等方面。升级到1.10版本可能意味着引入了新的特性,或者解决了在1.9.1版本中发现的...
【Java Web留言板项目】是一个适合初学者入门的实践项目,它涵盖了Web开发中的核心概念和技术。这个项目的主要功能包括用户登录、注册以及留言交互,所有数据都存储在数据库中,体现了Web应用程序与数据库的交互机制...
- **性能优化**:控制并发数量以防止对服务器造成过大压力,合理设置延迟以避免被封IP,同时注意内存管理和线程安全。 - **异常处理**:捕获并处理可能出现的网络错误、解析错误等异常情况,保证爬虫的稳定运行。 - ...
4. **性能优化** - **JVM调优**:包括堆内存、垃圾收集器、类加载器等的配置和分析。 - **数据库优化**:索引设计、SQL查询优化、缓存策略等。 - **Web服务器优化**:如Tomcat的配置调整,提升并发处理能力。 5....
9. **性能优化与调试**:如何通过优化代码、调整服务器配置等方式提高Web应用的性能,以及如何使用调试工具定位和解决问题。 10. **持续集成与自动化测试**:如Jenkins、Maven和JUnit等工具在持续集成和自动化测试...
使用WebHDFS Java客户端时,还需要考虑性能优化。例如,批量操作可以减少网络开销,预读取和缓存策略可以提高读取速度。了解HDFS的块大小和副本数设置对性能的影响也很重要。 综上所述,"webhdfs-java-client-...
7. **性能优化**: - **缓存技术**:如Redis、Memcached,用于存储热数据,减少数据库访问。 - **负载均衡与集群**:通过Nginx、Apache等工具,分发请求到多个服务器,提高系统可用性。 - **监控与日志**:如JMX...
### Java系统性能优化手册知识点详解 #### 一、前言 在Java系统开发过程中,为了提升系统的整体性能,开发者需要掌握一系列的优化技巧。本文档旨在通过总结《河南省人口与计划生育利益导向管理信息系统》的实际应用...
版本5.12.1.17771代表了插件的最新优化和改进,它提供了大量的内置规则,覆盖了代码风格、设计模式、性能优化等多个方面。这个插件能够与SonarQube服务器无缝对接,自动分析项目中的Java源代码,生成详细的报告,...
这两个版本的差异可能包括错误修复、性能优化、新功能的添加或API的调整。描述中提到的是从1.3.0到1.3.9的版本下载链接,这表明该库有持续的更新和维护。 WebSocket协议是一种在HTTP基础上建立持久连接的协议,它...
总之,`javamelody-core-1.52.0.jar`和`jrobin-1.5.9.jar`是JavaMelody监控解决方案的重要组成部分,它们共同为Java Web应用提供了详尽的性能监控和数据分析能力。通过集成这两个JAR,开发者可以轻松地对应用进行...
版本号的更新通常意味着新增功能、性能优化或者问题修复。 4. **集成步骤**: - 添加依赖:将SDK的jar包或者Maven/Gradle依赖引入项目。 - 注册App:在极光推送官网上注册应用,获取AppKey和MasterSecret。 - ...
系统性能优化是个很宽泛的命题, 本文从前台-中间件-后台 三个层面进行简要介绍了如何分析系统慢的原因, 并简要给出解决方向。 希望对新人有所帮助
每个版本通常会包含错误修复、性能优化以及对新功能的支持。 使用"mysql-connector-java-5.1.7-bin.jar"时,需要将其添加到Java项目的类路径中。这可以通过多种方式实现,例如在IDE(如Eclipse或IntelliJ IDEA)中...
1. **SkyWalking Java Agent**:SkyWalking的Java代理是一个自动探针,可以无侵入地附加到Java应用程序上,以收集各种性能指标。它通过字节码增强技术在运行时修改类,以便监控服务调用、追踪分布式事务、分析性能...
在2020-06版本中,Eclipse可能包含了一些新特性,比如性能优化、增强的代码提示和自动完成、改进的调试工具,以及对新版本的Java开发工具集(JDK)的支持。 对于JavaEE开发,虽然这个版本默认专注于JavaSE,但用户...
这个版本可能包含了对Java开发的各种增强功能,如性能优化、新特性的支持以及bug修复等。Eclipse的每个版本都会以字母“R”来标记主要发布,这通常意味着一个重大的稳定版本更新。 Tomcat,另一方面,是Apache软件...
9. **性能优化** 在高并发或大流量的Web应用中,优化CKEditor的性能至关重要。这可能涉及减少编辑器的加载时间、优化服务器与编辑器的通信,以及对用户输入数据的有效管理。 10. **未来升级** 虽然"ckeditor-java...