如何利用Java开发高性能、高并发Web应用

上传人:t****d 文档编号:242956958 上传时间:2024-09-12 格式:PPT 页数:29 大小:170.50KB
返回 下载 相关 举报
如何利用Java开发高性能、高并发Web应用_第1页
第1页 / 共29页
如何利用Java开发高性能、高并发Web应用_第2页
第2页 / 共29页
如何利用Java开发高性能、高并发Web应用_第3页
第3页 / 共29页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,如何用,Java进行高性能网站开发,1,Java程序性能优化技巧,生成对象时,合理分配空间和大小:,Java,中的很多类都有它的默认的空间分配大小,对于一些有大小的对象的初始化,应该预计对象的大小,然后使用进行初始化。,例如:我们在使用,Vector,,当声明,Vector vect,new Vector(),时,系统调用:,public Vector() /,缺省构造函数,this(10); /,容量是,10;,缺省分配,10,个对象大小容量。当执行,add,方法时,可以看到具体实现为:,.public synchronized boolean add(Object o) ,modCount+;,ensureCapacityHelper(elementCount+1);,elementDataelementCount+ =o;,return true;,2,Java程序性能优化技巧,生成对象时,合理分配空间和大小:,private void ensureCapacityHelper(int minCapacity) ,int oldCapacity = elementData.length;,if (minCapacity,oldCapacity) ,Object oldData = elementData;,int newCapacity = (capacityIncrement,0) ? (oldCapacity + capacityIncrement) :(oldCapacity * 2);,if (newCapacity,minCapacity) ,newCapacity = minCapacity;,elementData = new ObjectnewCapacity;,System.arraycopy(oldData, 0, elementData, 0, elementCount);,我们可以看到,当,Vector,大小超过原来的大小时,一些代码的目的就是为了做容量的扩充,在预先知道该,Vector,大小的话,可以指定其大小,避免容量扩充的开销。,3,Java程序性能优化技巧,优化循环体:,循环是比较重复运行的地方,如果循环次数很大,循环体内不好的代码对效率的影响就会被放大而变的突出。让我们看看下面的代码片:,.,Vector vect = new Vector(1000);.for( inti=0; i,vect.size(); i+),.,for,循环部分改写成:,int size = vect.size();for( int i=0; i,size; i+),.,如果,size=1000,,就可以减少,1000,次,size(),的系统调用开销,避免了循环体重复调用。,4,Java程序性能优化技巧,优化循环体:,再看如下的代码片:,.for (int i = 0;i,100000;i+)if (i%10 = 9) ,. /,每十次执行一次,改写成也可以提高效率:,.for(inti =0,j =10; i,100000; i+,j-),if(j = 0),. /,每十次执行一次,j = 10;,所以,当有较大的循环时,应该检查循环内是否有效率不高的地方,寻找更优的方案加以改进。,5,Java程序性能优化技巧,少用,new,初始化一个实例:,尽量少用,new,来初始化一个类的实例,当一个对象是用,new,进行初始化时,其构造函数链的所有构造函数都被调用到,所以,new,操作符是很消耗系统资源的,,new,一个对象耗时往往是局部变量赋值耗时的上千倍。同时,当生成对象后,系统还要花时间进行垃圾回收和处理。当,new,创建对象不可避免时,注意避免多次的使用,new,初始化一个对象。尽量在使用时再创建该对象。如:,NewObject object = new NewObject();int value;if(i,0 ),value =object.getValue();,6,Java程序性能优化技巧,少用,new,初始化一个实例:,上面一段代码可以修改为:,int value;if(i,0 ),NewObject object = new NewObject();,Value =object.getValue();,另外,应该尽量重复使用一个对象,而不是声明新的同类对象。一个重用对象的方法是改变对象的值,如可以通过,setValue,之类的方法改变对象的变量达到重用的目的。,7,Java程序性能优化技巧,选择合适的方法调用:,在,Java,中,一切都是对象,如果有方法(,Method,)调用,处理器先要检查该方法是属于哪个对象,该对象是否有效,对象属于什么类型,然后选择合适的方法并调用。可以减少方法的调用,同样一个方法:,public void CallMethod(int i ),if( i =0 ),return;,. /,其他处理,如果直接调用,,int i = 0;.CallMethod(i);,8,Java程序性能优化技巧,选择合适的方法调用:,上面的代码,就应该写成:,int i = 0;.if( i =0 ),CallMethod(i);,不影响可读性等情况下,可以把几个小的方法合成一个大的方法。另外,在方法前加上,final,,,private,关键字有利于编译器的优化。,9,Java程序性能优化技巧,异常处理技巧:,异常是,Java,的一种错误处理机制,对程序来说是非常有用的,但是异常对性能不利。抛出异常首先要创建一个新的对象,并进行相关的处理,造成系统的开销,所以异常应该用在错误处理的情况,不应该用来控制程序流程,流程尽量用,while,,,if,等处理。在不是很影响代码健壮性的前提下,可以把几个,try/catch,块合成一个。,尽量使用局部变量和静态变量:,尽量使用局部变量,调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(,Stack,) 中,速度较快。其他变量,如静态变量、实例变量等,都在堆(,Heap,)中创建,速度较慢。尽量使用静态变量,即加修饰符,static,,如果类中的变量不会随他的实例而变化,就可以定义为静态变量,从而使他所有的实例都共享这个变量。,同步处理技巧:,同步主要出现在多线程的情况,为多线程同时运行时提供对象数据安全的机制,多线程是比较复杂话题,应用多线程也是为了获得性能的提升,应该尽可能减少同步。另外,如果需要同步的地方,可以减少同步的代码段,如只同步某个方法或函数,而不是整个代码。,10,Java程序性能优化技巧,尽可能的使用,Java,自身提供的,API,:,Java,的,API,一般都做了性能的考虑,如果完成相同的功能,优先使用,API,而不是自己写的代码,如数组复制通常的代码如下:,int size = 1000;String strArray1 = new Stringsize;String strArray2 = new Stringsize;for(inti=0;i,size;i+) /,赋值,strArray1,= (new String(Array: + i);,for(inti=0;i,size;i+) /,复制,strArray2=(new String(String)a);,11,Java程序性能优化技巧,尽可能的使用,Java,自身提供的,API,:,上面那段代码,如果使用,Java,提供的,API,,就可以提高性能:,int size = 1000;String strArray1 = new Stringsize;String strArray2 = new Stringsize;for(inti=0;i,size;i+) /,赋值,strArray1 = (new String(Array: + i);,System.arraycopy(strArray1,0,strArray2,0,size); /,复制,同样的一个规则是,当有大量数据的复制时,应该使用,System.arraycopy(),。,12,Java程序性能优化技巧,尽量减少,I/O,操作:,输入,/,输出(,I/O,)包括很多方面,我们知道,进行,I/O,操作是很消耗系统资源的。程序中应该尽量少用,I/O,操作。使用时可以注意:,.,合理控制输出函数,System.out.println(),对于大多时候是有用的,特别是系统调试的时候,但也会产生大量的信息出现在控制台和日志上,同时输出时,有序列化和同步的过程,造成了开销。特别是在发行版中,要合理的控制输出,可以在项目开发时,设计好一个,Debug,的工具类,在该类中可以实现输出开关,输出的级别,根据不同的情况进行不同的输出的控制。,尽量使用缓存:,读写内存要比读写硬盘上的文件要快很多,应尽可能使用缓冲,以便直接从内存中读取数据。尽可能使用带有,Buffer,的类代替没有,Buffer,的类,如可以用,BufferedReader,代替,Reader,,用,BufferedWriter,代替,Writer,来进行处理,I/O,操作。同样可以用,BufferedInputStream,代替,InputStream,都可以获得性能的提高,13,Java程序性能优化技巧,尽量不使用同步:,Servlet,是多线程的,以处理不同的请求,基于前面同步的分析,如果有太多的同步就失去了多线程的优势了。,不用保存太多的信息在,HttpSession,中,很多时候,存储一些对象在,HttpSession,中是有必要的,可以加快系统的开发,如网上商店系统会把购物车信息保存在该用户的,Session,中,但当存储大量的信息或是大的对象在会话中时,是有害的,特别是当系统中用户的访问量很大,对内存的需求就会很高。具体开发时,在这两者之间应作好权衡。,14,Java程序性能优化技巧,清除,SESSION,:,通常情况,当达到设定的超时时间时,同时有些,Session,没有了活动,服务器会释放这些没有活动的,Session,,,.,不过这种情况下,特别是多用户并访时,系统内存要维护多个的无效,Session,。当用户退出时,应该手动释放,回收资源,实现如下:,.HttpSession theSession = request.getSession();/,获取当前,Sessionif(theSession != null),theSession.invalidate(); /,使该,Session,失效,。,缓存,Home,接口:,EJB,库使用,Enterprise Bean,的客户端通过它的,Home,接口创建它的实例。客户端能通过,JNDI,访问它。服务器通过,Lookup,方法来获取。,JNDI,是个远程对象,通过,RMI,方式调用,对它的访问往往是比较费时的。所以,在设计时可以设计一个类专门用来缓存,Home,接口,在系统初始化时就获得需要的,Home,接口并缓存,以后的引用只要引用缓存即可。,15,Java程序性能优化技巧,使用快速度的,Jdbc,驱动:,JDBC API,包括两种实现接口形式,一种是纯,Java,实现的驱动,一种利用,ODBC,驱动和数据库客户端实现,具体有四种驱动模式:,第一类:,JDBC-ODBC,桥,再加上,ODBC,驱动程序。第一类,JDBC,驱动程序是,JDBC-ODBC,桥再加上一个,ODBC,驱动程序。建议第一类驱动程序只用于原型开发,而不要用于正式的运行环境。桥接驱动程序由,Sun,提供,它的目标是支持传统的数据库系统。,Sun,为该软件提供关键问题的补丁,但不为该软件的最终用户提供支持。一般地,桥接驱动程序用于已经在,ODBC,技术上投资的情形,例如已经投资了,Windows,应用服务器。尽管,Sun,提供了,JDBC-ODBC,桥接驱动程序,但由于,ODBC,会在客户端装载二进制代码和数据库客户端代码,这种技术不适用于高事务性的环境。另外,第一类,JDBC,驱动程序不支持完整的,Java,命令集,而是局限于,ODBC,驱动程序的功能,这种驱动方式也叫胖客户,主要用于低并发请求,大数据量传输的应用。,16,Java程序性能优化技巧,使用快速度的,Jdbc,驱动:,第二类:本机,API,,部分是,Java,的驱动程序。第二类,JDBC,驱动程序是本机,API,的部分,Java,代码的驱动程序,用于把,JDBC,调用转换成主流数据库,API,的本机调用。这类驱动程序也存在与第一类驱动程序一样的性能问题,即客户端载入二进制代码的问题,而且它们被绑定了特定的平台。第二类驱动程序要求编写面向特定平台的代码,主流的数据库厂商,例如,Oracle,和,IBM,,都为它们的企业数据库平台提供了第二类驱动程序,使用这些驱动程序的开发者必须及时跟进不同数据库厂商针对不同操作系统发行的各个驱动程序版本。另外,由于第二类驱动程序没有使用纯,Java,的,API,,把,Java,应用连接到数据源时,往往必须执行一些额外的配置工作。很多时候,第二类驱动程序不能在体系结构上与大型主机的数据源兼容;即使做到了兼容,效果也是比较差。,17,Java程序性能优化技巧,使用快速度的,Jdbc,驱动:,第一类和第二类驱动的比较,18,Java程序性能优化技巧,使用快速度的,Jdbc,驱动:,第三类:面向数据库中间件的纯,Java,驱动程序。第三类,JDBC,驱动程序是面向数据库中间件的纯,Java,驱动程序,,JDBC,调用被转换成一种中间件厂商的协议,中间件再把这些调用转换到数据库,API,。第三类,JDBC,驱动程序的优点是它以服务器为基础,也就是不再需要客户端的本机代码,这使第三类驱动程序要比第一、二两类快。另外,开发者还可以利用单一的驱动程序连接到多种数据库。,19,Java程序性能优化技巧,使用快速度的,Jdbc,驱动:,第四类:直接面向数据库的纯,Java,驱动程序。 第四类,JDBC,驱动程序是直接面向数据库的纯,Java,驱动程序,即所谓的“瘦”(,thin,)驱动程序,它把,JDBC,调用转换成某种直接可被,DBMS,使用的网络协议,这样,客户机和应用服务器可以直接调用,DBMS,服务器。对于第四类驱动程序,不同,DBMS,的驱动程序不同。因此,在一个异构计算环境中,驱动程序的数量可能会比较多。但是,由于第四类驱动程序具有较高的性能,能够直接访问,DBMS,,所以这一问题就不那么突出了, 这种驱动方式,主要用于高并发,低数据量请求的应用中。,20,Java程序性能优化技巧,使用快速度的,Jdbc,驱动:,第三类和第四类驱动的比较,21,Java程序性能优化技巧,使用,Jdbc,链接池,为了提高访问数据库的性能,我们还可以使用,JDBC 2.0,的一些规范和特性,,JDBC,是占用资源的,在使用数据库连接时可以使用连接池,Connection Pooling,,避免频繁打开、关闭,Connection,。而我们知道,获取,Connection,是比较消耗系统资源的。,Connection,缓冲池:当一个应用程序关闭一个数据库连接时,这个连接并不真正释放而是被循环利用,建立连接是消耗较大的操作,循环利用连接可以显著的提高性能,因为可以减少新连接的建立。一个通过,DataSource,获取缓冲池获得连接,并连接到一个,CustomerDB,数据源的代码演示如下:,Context ctx = new InitialContext();DataSource dataSource = (DataSource) ctx.lookup(jdbc/CustomerDB);Connection conn = dataSource.getConnection(password,username);,22,Java程序性能优化技巧,缓存,DataSorce,一个,DataSource,对象代表一个实际的数据源。这个数据源可以是从关系数据库到表格形式的文件,完全依赖于它是怎样实现的,一个数据源对象注册到,JNDI,名字服务后,应用程序就可以从,JNDI,服务器上取得该对象,并使用之和数据源建立连接。通过上面的例子,我们知道,DataSource,是从连接池获得连接的一种方式,通过,JNDI,方式获得,是占用资源的。为了避免再次的,JNDI,调用,可以系统中缓存要使用的,DataSource,。,即时关闭使用过的资源,互联网应用系统一般是并发的系统,在每次申请和使用完资源后,应该释放供别人使用,使用完成后应该保证彻底的释放。,23,如何利用,Java开发高性能、高并发Web应用,架构选型,在网站,Web,应用开发中,系统的整体架构是决定网站性能、稳定性、并发、可扩展性的关键因素。下面以世界著名网站应用软件提供商,CoreMediaCMS,系统为例,进行架构分析,24,如何利用,Java开发高性能、高并发Web应用,架构选型,CoreMediaCMS,将整个应用分成四成架构,每一层都可以独立于其他层而正常运行,每一层都可以分布式布署,极大的提高了应用系统的稳定性、可扩展性、支持高并发的要求,每一次之前通过中间件,Corba,进行稳定的传输数据。,25,如何利用,Java开发高性能、高并发Web应用,开发框架的选型,充分利用开源框架,可以大大提高开发效率。很多初级开发者,都采用,DB+JavaBean+JSP,这种初级的开发模式,而现在主要使用,Struts,、,Spring,等,MVC,开发框架。,常用开发框架构选型有:,Struts,、,Spring,、,Webwork,等。,天极传媒选择的开发框架是:,Struts+Spring+iBatis,,在这个开发框架里,充分利用了,Struts,、,Spring,各自己的优点,可以选择,Stuts,MVC,,也可以选择,Spring MVC,。,26,如何利用,Java开发高性能、高并发Web应用,分级存储,)数据库数据分级存储:,将经常访问的数据和访问频度低的数据,分别存放到不同的分区,甚至存放到不同的数据库服务器,以便合进分配硬盘,I/O,及系统,I/O,。,)网站内容发布之后,分级存储:,任何一个大型的网站,一般都有海量的内容,为了提高访问效率,应搭建分级存储体系,根据应用的重要性和访问并发要求,将这些内容分级存储,同时将静态内容中的静态页面文件、图片文件、下载文件分不同的,Web,服务器访问,降低,I/O,争用,提高访问效率,同时让数据存储、管理、备份更加清晰。,),27,如何利用,Java开发高性能、高并发Web应用,页面静态化,一个大型网站,既有静态内容,也有动态内容。静态内容,直接通过,Apache,或者,Squid,访问,效率高,稳定可靠,更多的是受服务器等硬件设备的,I/O,吞吐量、网络环境及页面代码本身质量限制,不受应用系统及数据库性能限制,这些内容往往访问速度和效率不会有较大的问题。,而动态内容,除了受硬件设备,I/O,、操作系统,I/O,及内容、网络环境及页面代码的影响,还要受应用服务器和数据库性能影响,因此,这部份内容,要尽可能作静态化或者伪静态,并采用缓存技术,将其缓存,以减少对应用服务器和数据库服务器的操作次数,提高用户访问效率和稳定性。,28,如何利用,Java开发高性能、高并发Web应用,缓存策略,对于构建的业务系统,如果有些数据要经常要从数据库中读取,同时,这些数据又不经常变化,这些数据就可以在系统中缓存起来,使用时直接读取缓存,而不用频繁的访问数据库读取数据。缓存工作可以在系统初始化时一次性读取数据,特别是一些只读的数据,当数据更新时更新数据库内容,同时更新缓存的数据值。例如:在天极,CMS2005,系统中,我们将很少发生变化的网站节点树数据,缓存在客户端,当用户登录时,一次性读入到客户端缓存起来,以后编辑在使用时,不用再从数据库中读取,大大提高了应用系统的访问速度。,当然,也可以将数据库中重复访问的数据缓存在应用服务器内存中,减少对数据库的访问次数,,Java,常用的缓存技术产品有:,MemoryCache,、,OSCache,等。,29,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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