您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 性能优化交流演示课件
性能优化交流wangql@nci.com.cn理解Java内存•Heap:运行时数据区,动态创建,GC回收。•Stack:存取速度比堆要快,栈数据可以共享,存在栈中的数据大小与生存期必须是确定的,栈中主要存放一些基本类型的变量(,int,short,long,byte,float,double,boolean,char)和对象句柄。•Other(Static,String,Functioncode)尽量使用局部变量•好处:作用范围是变量定义的方法内部,一旦离开作用域,栈内存将被快速释放,与GC无关。•其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。慎用异常•异常只能用于错误处理,不适合用来控制流程。•抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,VM就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。多线程--活用“锁”1•Synchronized•ReetrantLock:公平,或不公平多线程--活用“锁”2synchronized和Lock的吞吐率单CPUsynchronized和Lock的吞吐率4个CPU多线程--活用“锁”3使用4个CPU时的同步、协商锁和公平锁的相对吞吐率使用1个CPU时的同步、协商和公平锁的相对吞吐率多线程--活用“锁”4•不要仅仅是假设如果使用ReentrantLock“性能会更好”。•什么时候才应该使用ReentrantLock?在确实需要一些synchronized所没有的特性的时候,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。•高度争用时使用ReentrantLock,但是大多数synchronized块几乎从来没有出现过争用。线程池--Executors•创建和销毁线程是非常耗资源的。•例,创建20个线程大小的线程池:Executors.newFixedThreadPool(20);掌握原子并发•Hashtable(或者替代方案Collections.synchronizedMap)的可伸缩性的主要障碍是它使用了一个map范围(map-wide)的锁,为了保证插入、删除或者检索操作的完整性必须保持这样一个锁,而且有时候甚至还要为了保证迭代遍历操作的完整性保持这样一个锁。这样一来,只要锁被保持,就从根本上阻止了其他线程访问Map,即使处理器有空闲也不能访问,这样大大地限制了并发性。掌握原子并发--ConcurrentHashMap•摒弃了单一的map范围的锁,取而代之的是由32个锁组成的集合,其中每个锁负责保护hashbucket的一个子集。锁主要由变化性操作(put()和remove())使用。具有32个独立的锁意味着最多可以有32个线程可以同时修改map。•绝大多数系统应用绝对够用。•ConcurrentLinkedQueue也具有类似的原理。学会异步调用•SwingWorker•doInBackground--后台执行•publish--中间过程应用•done--完成后的处理New,clone,reflection•对象生成效率:new深clonereflection•复杂对象(带有数据结构参数,如Map,List),浅clonenewreflection字符串优化•减少字符串打印•使用StringBuffer,避免多字符串级联SQL优化--查询缺陷1•1、循环查询(常见)。2、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)。3、I/O吞吐量小,形成了瓶颈效应。4、没有创建计算列导致查询不优化。5、内存不足6、网络速度慢SQL优化--查询缺陷2•7、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)8、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)9、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。10、返回了不必要的行和列11、查询语句不好,没有优化SQL优化--语句优化1•使用索引来更快地遍历表•NOTIN会多次扫描表,建议使用EXIST,NOTEXIST,IN,LEFTOUTERJOIN•EXISTS要远比IN的效率高。里面关系到fulltablescan和rangescan。几乎将所有的IN操作符子查询改写为使用EXISTS的子查询。•在海量查询时尽量少用格式转换SQL优化--语句优化2•IN、OR子句常会使用工作表,使索引失效。如果不产生大量重复值,可以考虑把子句拆开。拆开的子句中应该包含索引•慎用游标。在某些必须使用游标的场合,可考虑将符合条件的数据行转入临时表中,再对临时表定义游标进行操作,这样可使性能得到明显提高。SQL优化--语句优化3•不用“”或者“!=”操作符。对不等于操作符的处理会造成全表扫描,可以用“”or“”代替。•Where子句中出现ISNULL或者ISNOTNULL时,Oracle会停止使用索引而执行全表扫描。可以考虑在设计表时,对索引列设置为NOTNULL。•当通配符“%”或者“_”作为查询字符串的第一个字符时,索引不会被使用。SQL优化--语句优化4•对于有连接的列“||”,最后一个连接列索引会无效。尽量避免连接,可以分开连接或者使用不作用在列上的函数替代。•如果索引不是基于函数的,那么当在Where子句中对索引列使用函数时,索引不再起作用。•Where子句中避免在索引列上使用计算,否则将导致索引失效而进行全表扫描。#对数据类型不同的列进行比较时,会使索引失效。SQL优化--语句优化5•用“=”替代“”。•UNION操作符会对结果进行筛选,消除重复,数据量大的情况下可能会引起磁盘排序。如果不需要删除重复记录,应该使用UNIONALL。•Oracle从下到上处理Where子句中多个查询条件,所以表连接语句应写在其他Where条件前,可以过滤掉最大数量记录的条件必须写在Where子句的末尾。SQL优化--语句优化6•Oracle从右到左处理From子句中的表名,所以在From子句中包含多个表的情况下,将记录最少的表放在最后。•OrderBy语句中的非索引列会降低性能,可以通过添加索引的方式处理。严格控制在OrderBy语句中使用表达式。•当在Sql语句中连接多个表时,使用表的别名,并将之作为每列的前缀。这样可以减少解析时间。SQL优化--语句优化7•多利用内部函数提高Sql效率。•不同区域出现的相同的Sql语句,要保证查询字符完全相同,以利用SGA共享池,防止相同的Sql语句被多次分析。SQL优化--优化器•Oracleoptimizer•SQLServeranalyser性能分析•Jmeter•NetbeansProfiler•EclipseTPTP•SOAPUI讨论1•A•for(inti=0;i10000;i++){•Objecto=newObject();•}•B•Objecto=null;•for(inti=0;i10000;i++){•o=newObject();•}
本文标题:性能优化交流演示课件
链接地址:https://www.777doc.com/doc-3881613 .html