Java代码优化ppt课件
合集下载
2最新《Java代码与架构之完美优化》配套精品课件.3.7 文档结构
20、列表
■ 内容
不使用<li>标签来缩进。
嵌套列表时要使用正确的编号格式, 以便于理解。
整个网站的层次结构配置要统一。
21、改行(1/2)
■ 内容
在HTML中可以在同一标签范围内改行。 可以在标签中可插入空格的地方改行, 在不可插入空格的地方不改行。 标签开始符的后面和终止符的前面改行 被视为无效。
《Java代码与架构之完美优化——实战经典》
附录二Байду номын сангаас《JSP编程规约》
——2.3 XHTML规约/2.3.7 文档结构(19~21/24)
作者:颜廷吉
目录 Contents
@
19、标题
@
20、列表
@
21、改行
19、标题
■ 内容
标题部分使用<h>标签,从<h1>递增。
不使用<h>标签来调整字体。
21、改行(2/2) ■ 示例
7
java系统性能优化手册PPT课件
上面条件单独使用会导致全表检索。要和其他条件组合使用,避免 全表检索。
专业的IT服务
12.索引列运算: 对于索引列进行函数运算会导致索引无效。 × SELECT ENAME FROM EMP WHERE TO_CHAR( UPD_DT, ‘YYYYMMDD’ ) = ‘20000803’ ○ SELECT ENAME FROM EMP WHERE UPD_DT = TO_DATE( ‘20000803’, ‘YYYYMMDD’ )
中间件服务器:weblogic9
最大支持并发数: 7600
专业的IT服务
系统参数
1. 避免在循环中定义局部变量,会导致大量的内存占用。 2. ArrayList性能要好于Vector。
Vector是线程安全的,而ArrayList是非线程安全的。且Vector内部存 储了多余数据。 3. HashMap性能要优于Hashtable因为后者是线程安全的。 4. Iterator遍历要比直接遍历集合慢。
专业的IT服务
以上的方法都是向字符串缓冲区“追加”元素,但是,这个“元素”参 数可以是布尔量、字符、字符数组、双精度数、浮点数、整型数、长 整型数对象类型的字符串、字符串和StringBuffer类等。如果添加的 字符超出了字符串缓冲区的长度,Java将自动进行扩充。
专业的IT服务
7.从ResultSet取得字段值时,尽量使用对应类型的get方法,避免潜在 的类型转换。 8.尽量只检索必要的字段,避免过多冗余数据检索,避免出现”select * from tableName”类型语句。 9.如果可能,将多次检索数据的SQL语句合并成一个进行检索。 10.为'Vectors' 和 'Hashtables'定义初始大小
专业的IT服务
12.索引列运算: 对于索引列进行函数运算会导致索引无效。 × SELECT ENAME FROM EMP WHERE TO_CHAR( UPD_DT, ‘YYYYMMDD’ ) = ‘20000803’ ○ SELECT ENAME FROM EMP WHERE UPD_DT = TO_DATE( ‘20000803’, ‘YYYYMMDD’ )
中间件服务器:weblogic9
最大支持并发数: 7600
专业的IT服务
系统参数
1. 避免在循环中定义局部变量,会导致大量的内存占用。 2. ArrayList性能要好于Vector。
Vector是线程安全的,而ArrayList是非线程安全的。且Vector内部存 储了多余数据。 3. HashMap性能要优于Hashtable因为后者是线程安全的。 4. Iterator遍历要比直接遍历集合慢。
专业的IT服务
以上的方法都是向字符串缓冲区“追加”元素,但是,这个“元素”参 数可以是布尔量、字符、字符数组、双精度数、浮点数、整型数、长 整型数对象类型的字符串、字符串和StringBuffer类等。如果添加的 字符超出了字符串缓冲区的长度,Java将自动进行扩充。
专业的IT服务
7.从ResultSet取得字段值时,尽量使用对应类型的get方法,避免潜在 的类型转换。 8.尽量只检索必要的字段,避免过多冗余数据检索,避免出现”select * from tableName”类型语句。 9.如果可能,将多次检索数据的SQL语句合并成一个进行检索。 10.为'Vectors' 和 'Hashtables'定义初始大小
3最新《Java代码与架构之完美优化》配套精品课件.2 注释
■ 示例
9、注释的使用(1/2)
■ 内容
注释写在 /* */ 里。
不在注释中嵌套注释。
9、注释的使用(2/2)
■ 示例
10、帮助理解CSS源文件的内容(1/2)
■ 内容
通过使用恰当注释格式,可使各 selector的适用范围变得通俗易懂。
10、帮助理解CSS源文件的内容(2/2)
■ 示例
11、特殊设定说明(1/2)
■ 内容
为了修正浏览器之间的差异以及页 面崩溃等Bug,可在CSS中加入特殊 设定。同时,为日后可以很容易地理 解这部分的功能,可以写入注释。
11、特殊设定说明(2/2)
■ 示例
11
《Java代码与架构之完美优化——实战经典》
附录三:《CSS编程规约》
——3.2 注释(8~11/18)
作者:颜廷吉
目录 Contents
@
8、头部注释
@
9、注释的使用
@ห้องสมุดไป่ตู้
10、帮助理解CSS源文件的内容
@
11、特殊设定说明
8、头部注释(1/2)
■ 内容
在CSS文件的开头写入注释。
8、头部注释(2/2)
Java代码优化ppt课件
reference类型在32位系统上每个占用4bytes, 在64位系 统上每个占用8bytes。
19
100个entries,cost 8.6k, 实际的double=2*100*8=1.6k
20
Double=16+8,double=8,67%额外开销
21
TreeMap包括: 48bytes+n*40bytes(entry)
Cache分类实现 1.AlarmCache封装了活动告警/1409/清除告警的插入,活动放7天,清除3小时
2.AlarmCFPCache<cfp,fpList>增加本地缓存,提升查询效率
14
DW缓存优化 封装完,代码量依然很大,而且日志不方便,继续拆分:
1.alarmService负责写操作,cacheService负责读操作
3、找到优化的关键点
这是有效优化的关键。找到项目中与你的目标(性能、资源或其他)相背的地方,并将你的努力和 时间用在那里。举一个典型的例子,一个Web项目速度比较慢,开发者在优化时将大部分精力放在了数 据库优化上,最终发现真正的问题是网络连接慢。另外,不要分心于容易实现的问题。这些问题尽管很 容易解决,但可能不是必要的,或与你的目标不相符。容易优化并不意味着值得你花费工夫。
2、选择正确的优化指标
选择正确的指标,是优化的一个重要组成部分,你需要按照这些指标来测量优化工作的进展情况。如 果指标选择不恰当,或者完全错误,你所做的努力有可能白费了。即使指标正确,也必须有一些辨别。 在某些情况下,将最多的努力投入到运行消耗时间最多的那部分代码中,这是实用的策略。但也要记住, Unix/Linux内核的大部分时间花费在了空循环上。需要注意的是,如果你轻易选择了一个很容易达到的 指标,这作用不大,因为没有真正解决问题。你有必要选择一个更复杂的、更接近你的目标的指标。
《如何优化JAVA应用》课件
● 以下是用户提供的信息和标题: ● 我正在写一份主题为“《如何优化JAVA应用》PPT课件”的PPT,现在准备介绍“JAVA应用性能优化”,请帮我生成“性能优化策略”为标题的内
容 ● 性能优化策略
● 代码优化:通过优化代码结构、算法和数据结构来提高应用程序的执行效率
● JVM参数调优:根据应用程序的特点和需求,调整JVM参数以获得更好的性能
PART SEVEN
部署架构:介绍微服务架构、容器化技术、Docker等 容器化技术:介绍Docker的原理、使用方法、优势等 部署架构优化:介绍如何通过容器化技术优化JAVA应用的部署架构 监控优化:介绍如何通过容器化技术对JAVA应用进行监控和优化
监控和告警系统的重要性
监控和告警系统的组成
去除冗余代码:删除不必要的 代码,提高代码质量
优化算法:改进算法,提高程 序运行效率
减少内存占用:优化内存管理, 减少内存占用
代码可读性:提高代码可读性, 方便维护和调试
PART SIX
数据库连接池 的使用
索引的使用和 优化
查询语句的优 化
数据库连接的 关闭和释放
数 据 库 索 引 : 介 绍 索 引 的 概 念 、 作 用 和 应 用 场 景 , 以 及 在 JAVA 应 用 中 如 何 使 用 索 引 进 行 优 化 缓 存 技 术 : 介 绍 缓 存 的 概 念 、 作 用 和 应 用 场 景 , 以 及 在 JAVA 应 用 中 如 何 使 用 缓 存 进 行 优 化
● 多线程优化:合理利用多线程技术,提高应用程序的并发处理能力和响应速度
● 缓存技术:利用缓存技术减少对数据库等外部资源的访问,提高应用程序的响应速度和吞吐量
识别性能瓶颈: 通过分析应用程 序的响应时间、 吞吐量、内存使 用等指标,确定 性能瓶颈所在
容 ● 性能优化策略
● 代码优化:通过优化代码结构、算法和数据结构来提高应用程序的执行效率
● JVM参数调优:根据应用程序的特点和需求,调整JVM参数以获得更好的性能
PART SEVEN
部署架构:介绍微服务架构、容器化技术、Docker等 容器化技术:介绍Docker的原理、使用方法、优势等 部署架构优化:介绍如何通过容器化技术优化JAVA应用的部署架构 监控优化:介绍如何通过容器化技术对JAVA应用进行监控和优化
监控和告警系统的重要性
监控和告警系统的组成
去除冗余代码:删除不必要的 代码,提高代码质量
优化算法:改进算法,提高程 序运行效率
减少内存占用:优化内存管理, 减少内存占用
代码可读性:提高代码可读性, 方便维护和调试
PART SIX
数据库连接池 的使用
索引的使用和 优化
查询语句的优 化
数据库连接的 关闭和释放
数 据 库 索 引 : 介 绍 索 引 的 概 念 、 作 用 和 应 用 场 景 , 以 及 在 JAVA 应 用 中 如 何 使 用 索 引 进 行 优 化 缓 存 技 术 : 介 绍 缓 存 的 概 念 、 作 用 和 应 用 场 景 , 以 及 在 JAVA 应 用 中 如 何 使 用 缓 存 进 行 优 化
● 多线程优化:合理利用多线程技术,提高应用程序的并发处理能力和响应速度
● 缓存技术:利用缓存技术减少对数据库等外部资源的访问,提高应用程序的响应速度和吞吐量
识别性能瓶颈: 通过分析应用程 序的响应时间、 吞吐量、内存使 用等指标,确定 性能瓶颈所在
Java优化课程PPT教学课件
2020/12/12
PPT教学课件
谢谢观看
Thank You For Watching
2020/12/12
2020/12/12Fra bibliotekmcatMySQLOracle12学时第三期间开源结构 Struts2HibernateSpringEclipseTomcatWeblogicMySQLOracle36学时5、详细课程放置 第一期间:Java遣词(2天)第一天Java的生长概略、JVM、废物收受秉承机制、代码 安定性Java遣词特色JavaSE5.0新特色简介定义类、成员、机关函数、编制重载标识符 、关头字、数据类型表达式和流程控制:分支控制、循环控制数组定义和声明、***数组 的建树JDK5.0中对数组的迭代类的背负类的多态性、Object类介绍、this/super关头字、 值传递final、static、abstract关头字第二天罗列类型抽象类、接口、内部类捕获反常、 建树自定义反常Java基础类Java集结结构:List,Set,Map,迭代器泛型机制Java多线
Java优化课程
2020/12/12
各有关单元:中软总公司计较机训练中心是中软属下IT高档手工训练及国内认证的专业 教训训练组织。训练中心依托中软壮大的手工人才优势,致力于为国内大型企事业供应 一流、行进前辈、合用的IT手工训练。中心近期将进行“Java优化课程训练”,详细事宜 通知以下:1、训练介绍本课程从Java遣词开始,殷切浅出,墨守成规,理论与实习相 系掌控全数Java体系,能够谙练操作最流行,最抢手的JavaEE相干手工及其斥地东西斥 地公司级操作。2、训练目标Java基础亏弱,希望从基础进修,建议从第一期间开始进 修粗通Java遣词,不熟谙JavaEE,建议从第二期间进修粗通Java遣词,并且熟谙 JSP/Servlet,建议从第三期间进修3、训练政策第一期间:粗通Java遣词(根据Jav
PPT教学课件
谢谢观看
Thank You For Watching
2020/12/12
2020/12/12Fra bibliotekmcatMySQLOracle12学时第三期间开源结构 Struts2HibernateSpringEclipseTomcatWeblogicMySQLOracle36学时5、详细课程放置 第一期间:Java遣词(2天)第一天Java的生长概略、JVM、废物收受秉承机制、代码 安定性Java遣词特色JavaSE5.0新特色简介定义类、成员、机关函数、编制重载标识符 、关头字、数据类型表达式和流程控制:分支控制、循环控制数组定义和声明、***数组 的建树JDK5.0中对数组的迭代类的背负类的多态性、Object类介绍、this/super关头字、 值传递final、static、abstract关头字第二天罗列类型抽象类、接口、内部类捕获反常、 建树自定义反常Java基础类Java集结结构:List,Set,Map,迭代器泛型机制Java多线
Java优化课程
2020/12/12
各有关单元:中软总公司计较机训练中心是中软属下IT高档手工训练及国内认证的专业 教训训练组织。训练中心依托中软壮大的手工人才优势,致力于为国内大型企事业供应 一流、行进前辈、合用的IT手工训练。中心近期将进行“Java优化课程训练”,详细事宜 通知以下:1、训练介绍本课程从Java遣词开始,殷切浅出,墨守成规,理论与实习相 系掌控全数Java体系,能够谙练操作最流行,最抢手的JavaEE相干手工及其斥地东西斥 地公司级操作。2、训练目标Java基础亏弱,希望从基础进修,建议从第一期间开始进 修粗通Java遣词,不熟谙JavaEE,建议从第二期间进修粗通Java遣词,并且熟谙 JSP/Servlet,建议从第三期间进修3、训练政策第一期间:粗通Java遣词(根据Jav
最新《Java代码与架构之完美优化》配套精品课件0412_01_如何对臃肿的方法进行瘦身
9
《Java代码与架构之完美优化——实战经典》
第四章 方法优化技巧 ——4.12如何对臃肿的方法进行瘦身(34/77)
作者:颜廷吉
目录 Contents
@ @ @
1、优化前代码有哪些瑕疵? 2、现象描述是什么? 3、有哪些不利影响? 4、有哪些检测工具与方法? 5、最佳解决方案是什么? 6、如何解析优化后代码?
1.降低了代码的可读性与可维护性;
2.几乎无法重复利用; 3.方法的重写也会变得很难;
4、有哪些检测工具与方法?
■检测工具或方法 1.(C)Maximum Method Length
5、最佳解决方案是什么?
■最佳解决方案
对臃肿的方法进行瘦身的常用方法有以下四种: 1.一个方法有效代码超过150行时,就应该提炼出多 个方法。用本例优化技巧12(分解方法)进行分解。 2.遇到一段需要注释才能让人理解用途的代码时,就 应该将这段代码放进一个独立方法中。 3.几个方法之间有重复代码,需要把共通的代码提炼 成一个方法。 4. 如果使用了太多间接层,使得系统中所有方法都 似乎只是对另一个方法的简单委托,造成在这些委托 动作之间晕头转向,繁多的没有特别价值的小方法时, 就要用本例优化技巧13(合并方法)进行处理。
6、如何解析优化后代码?
■优化后代码解析 代码1,休息sleep方法包含的内容 太多了。优化后代码3里,把休息的方 法分解成一个主控方法(sleep)及2个 小方法(wash、prepareSleep),主 控方法来控制两个小方法的执行顺序, 这样就使得代码清晰而优雅。 代码2,需要删除中间过渡处理方法, 特别是在程序经过多次修改之后,这种 代码出现的几率就非常大。
@
@ @
1、优化前代码有哪些瑕疵?
最新《Java代码与架构之完美优化》配套精品课件0703_避免捕获NullPointerException或Error
《Java代码与架构之完美优化——实战经典》
第七章 如何正确使用异常 ——7.3避免捕获NullPointerException或Errorቤተ መጻሕፍቲ ባይዱ(52/77)
作者:颜廷吉
目录 Contents
@ @ @
1、优化前代码有哪些瑕疵? 2、现象描述是什么? 3、有哪些不利影响? 4、有哪些检测工具与方法? 5、最佳解决方案是什么? 6、如何解析优化后代码?
6、如何解析优化后代码?
■优化后代码解析 代码2里,把代码1中的Error换成了 其子类AssertinoError,同时删掉了对 NullPointerException异常的拦截。
9
4、有哪些检测工具与方法?
■检测工具或方法 1.(P)AvoidCatchingNPERule 2.(C)Illegal Catch
5、最佳解决方案是什么?
■最佳解决方案 对捕获运行时异常的,去掉对 NullPointerException异常的捕获;对 捕获Error异常的,用具体Error的子类 来代替。
@
@ @
1、优化前代码有哪些瑕疵?
■优化前代码 实例1
动动脑筋:本例代码中有哪些瑕疵,应该如何优化?
2、现象描述是什么?
■现象描述 在catch语句里,直接捕获 NullPointerException或Error异常。
3、有哪些不利影响?
■不利影响分析 NullPointerException是 RuntimeException的一种,由虚拟机 在实际运行中自动捕捉,这种异常不 需要进行捕捉。 如果直接捕获错误的基类Error ,其 包含的异常范围很广,不知道具体的 异常情况,有可能会进行不恰当的处 理,得到预想以外的后果。
第七章 如何正确使用异常 ——7.3避免捕获NullPointerException或Errorቤተ መጻሕፍቲ ባይዱ(52/77)
作者:颜廷吉
目录 Contents
@ @ @
1、优化前代码有哪些瑕疵? 2、现象描述是什么? 3、有哪些不利影响? 4、有哪些检测工具与方法? 5、最佳解决方案是什么? 6、如何解析优化后代码?
6、如何解析优化后代码?
■优化后代码解析 代码2里,把代码1中的Error换成了 其子类AssertinoError,同时删掉了对 NullPointerException异常的拦截。
9
4、有哪些检测工具与方法?
■检测工具或方法 1.(P)AvoidCatchingNPERule 2.(C)Illegal Catch
5、最佳解决方案是什么?
■最佳解决方案 对捕获运行时异常的,去掉对 NullPointerException异常的捕获;对 捕获Error异常的,用具体Error的子类 来代替。
@
@ @
1、优化前代码有哪些瑕疵?
■优化前代码 实例1
动动脑筋:本例代码中有哪些瑕疵,应该如何优化?
2、现象描述是什么?
■现象描述 在catch语句里,直接捕获 NullPointerException或Error异常。
3、有哪些不利影响?
■不利影响分析 NullPointerException是 RuntimeException的一种,由虚拟机 在实际运行中自动捕捉,这种异常不 需要进行捕捉。 如果直接捕获错误的基类Error ,其 包含的异常范围很广,不知道具体的 异常情况,有可能会进行不恰当的处 理,得到预想以外的后果。
java系统性能优化手册PPT课件
上面条件单独使用会导致全表检索。要和其他条件组合使用,避免 全表检索。
专业的IT服务
12.索引列运算: 对于索引列进行函数运算会导致索引无效。 × SELECT ENAME FROM EMP WHERE TO_CHAR( UPD_DT, ‘YYYYMMDD’ ) = ‘20000803’ ○ SELECT ENAME FROM EMP WHERE UPD_DT = TO_DATE( ‘20000803’, ‘YYYYMMDD’ )
专业的IT服务
例子:设EMP表由三个索引,索引字段分别为SAL 、 DEPTNO、JOB、EMPNO,EMPNO 为唯一字段。
1) SELECT ENAME FROM EMP WHERE DEPTNO = 20 AND JOB = ‘MANAGER’ 索引被合并使用。 2) SELECT ENAME FROM EMP WHERE SAL = 4000 AND EMPNO = 7902 EMPNO被使用,因为唯一索引级别高。 3) SELECT ENAME FROM EMP WHERE DEPTNO > 20 AND JOB = ‘MANAGER’ JOB的索引被使用 4) SELECT ENAME FROM EMP WHERE SAL > 4000 AND EMPNO > 1 SAL的索引被使用,EMPNO更有效,所以应该调整次序。
专业的IT服务
专业的IT服务
专业的IT服务
专业的IT服务
专业的IT服务
NULL的回避: null值不存储在索引中,所以使用IS (NOT)NULL 会导致全表检索。
专业的IT服务
13.联合索引的场合,要注意索引字段的次序。单独使用后面的索引 字段无效。 14. 别名的使用: 给表指定别名,能够减少SQL解析的时间。 15. FROM表的次序:
专业的IT服务
12.索引列运算: 对于索引列进行函数运算会导致索引无效。 × SELECT ENAME FROM EMP WHERE TO_CHAR( UPD_DT, ‘YYYYMMDD’ ) = ‘20000803’ ○ SELECT ENAME FROM EMP WHERE UPD_DT = TO_DATE( ‘20000803’, ‘YYYYMMDD’ )
专业的IT服务
例子:设EMP表由三个索引,索引字段分别为SAL 、 DEPTNO、JOB、EMPNO,EMPNO 为唯一字段。
1) SELECT ENAME FROM EMP WHERE DEPTNO = 20 AND JOB = ‘MANAGER’ 索引被合并使用。 2) SELECT ENAME FROM EMP WHERE SAL = 4000 AND EMPNO = 7902 EMPNO被使用,因为唯一索引级别高。 3) SELECT ENAME FROM EMP WHERE DEPTNO > 20 AND JOB = ‘MANAGER’ JOB的索引被使用 4) SELECT ENAME FROM EMP WHERE SAL > 4000 AND EMPNO > 1 SAL的索引被使用,EMPNO更有效,所以应该调整次序。
专业的IT服务
专业的IT服务
专业的IT服务
专业的IT服务
专业的IT服务
NULL的回避: null值不存储在索引中,所以使用IS (NOT)NULL 会导致全表检索。
专业的IT服务
13.联合索引的场合,要注意索引字段的次序。单独使用后面的索引 字段无效。 14. 别名的使用: 给表指定别名,能够减少SQL解析的时间。 15. FROM表的次序:
最新《Java代码与架构之完美优化》配套精品课件0606_01_避免实例化特有工具类
6、如何解析优化后代码?
■优化后代码解析 代码1中的工具类是系统特有的,需 要使用final来限制其继承性。优化后代 码2里,同时使用了解决方案中所述的 三种技术,保证了其不被实例化。
9
4、有哪些检测工具与方法?
■检测工具或方法 1.(R)人工检查
5、最佳解决方案是什么?
■最佳解决方案 对于特有工具类,我们需要使用以下 三种技术对其进行封装保护: 1.用final修饰符,来防止类的继承; 2.把构造方法私有化,来防止类构建实 例对象; 3.在构造方法内抛出异常,来防止反射 机制对其进行反射
第六章 如何优化类与接口 ——6.6避免实例化特有工具类(45/77)
作者:颜廷吉
目录 Contents
@ @ @
1、优化前代码有哪些瑕疵? 2、现象描述是什么? 3、有哪些不利影响? 4、有哪些检测工具与方法? 5、最佳解决方案是什么? 6、如何解析优化后代码?
@
@ @
1、优化前代码有哪些瑕疵?
■优化前代码 实例1
动动脑筋:本例代码中有哪些瑕疵,应该如何优化?
2、现象描述是什么?
■现象描述 特有工具类可以进行实例化,亦可被继承。
3、有哪些不利影响?
■不利影响分析 如果是本系统特有的工具类,那么 其方法的内容是不准许更改的,这就 需要对其进行保护,如JDK里的Math 类。如果不对其进行保护,通过继承 或者利用反射技术就可以改变原方法 的内容。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.AlarmCFPCache<cfp,fpList>增加本地缓存,提升查询效率
DW缓存优化 封装完,代码量依然很大,而且日志不方便,继续拆分:
1.alarmService负责写操作,cacheService负责读操作
好处:
DW缓存优化
1.写和读分离
2.实时告警处理和告警查询日志分开
3.写增加线程处理,读增加cache处理
明确为什么优化。现场问题触发,维护工作量大等等
优化是要朝着好的方向发展而不是过度地优化,过度优化会降低程序 可读性,会给后期维护人员增加难度系数。满足实际需要即可,不要为 了优化而优化。 要对优化的对象,进行测试或者有一定的深入理解。有 些api人家的单线程效率就非常高,你为了优化,写了一堆多线程,然后 各种锁,各种问题。。。。。
2、选择正确的优化指标
选择正确的指标,是优化的一个重要组成部分,你需要按照这些指标来测量优化工作的进展情况。如 果指标选择不恰当,或者完全错误,你所做的努力有可能白费了。即使指标正确,也必须有一些辨别。 在某些情况下,将最多的努力投入到运行消耗时间最多的那部分代码中,这是实用的策略。但也要记住, Unix/Linux内核的大部分时间花费在了空循环上。需要注意的是,如果你轻易选择了一个很容易达到的 指标,这作用不大,因为没有真正解决问题。你有必要选择一个更复杂的、更接近你的目标的指标。
DW缓存优化
公共方法抽象 Cache分类实现 读写分离
DW缓存优化 1.1个类2000多行代码,好多重复操作,先抽象公共方法
Cache分类实现 1.AlarmCache在1406,ack,1409等各种消息里重复操作
2.ClearCache在1406,手动清除等各种消息重复操作
Cache分类实现 1.AlarmCache封装了活动告警/1409/清除告警的插入,活动放7天,清除3小时
Java代码优化
综合监控
代码优化原则 代码优化步骤 代码优化实践
代码优化
代码优化原则
代码优化是什么。代码优化是指对程序代码进行等价(指不改变程序 的运行结果)变换。程序代码可以是中间代码,也可以是目标代码。等 价的含义是使得变换后的代码运行结果与变换前代码运行结果相同。优 化的含义是最终生成的目标代码更加轻松自如(运行时间更短、占用空 间更小)地工作,时空效率优化。
3、找到优化的关键点
这是有效优化的关键。找到项目中与你的目标(性能、资源或其他)相背的地方,并将你的努力和 时间用在那里。举一个典型的例子,一个Web项目速度比较慢,开发者在优化时将大部分精力放在了数 据库优化上,最终发现真正的问题是网络连接慢。另外,不要分心于容易实现的问题。这些问题尽管很 容易解决,但可能不是必要的,或与你的目标不相符。容易优化并不意味着值得你花费工夫。
告警统计效率优化 其他方法:使用JavaVisualVM/Jprofiler查看方法耗时
DW线程优化 问题:DealThread,SendDataThread等都用Queue传递数据
方法:抽象、继承
DW线程优化
修改前
修改后
DW线程优化
抽象后可以 1.重复代码降低 2.统一的异常判断,catch 3.Package调整,统一的日志记录 4.统一的speed实现 5.统一的心跳信息处理
问题:运行一S段m时a间t内c存h溢e出r内存问题
方法:jmap
Smatcher内存问题 1.zkClient$7就是监听数据变更的通知对象
2.进一步查找:居然有1w多个监听器 3.日志:不停的有新客户端注册过来,其实是一样的,新注册就会添 加listener。。。
结论:查看代码修改注册机制
Java对象占用内存了解
使用java工具:jmap,jstack,jprofiler等
4、优化完后测试功能!
代码优化实践
运行更快 1.告警统计效率优化( jstack,内存换效率) 2.DataWorker线程抽象 3.DataWorker缓存读写分离 内存更小 1.Smatcher内存问题 2.Java对象占用内存 先预防,再优化
预防大于优化。
1、明确优化目标
代码优化步骤
在优化工作开始的时候,你还尚未明确优化内容和目的,那么你很容易陷入误区。在一开始,你就应 该清楚地了解你要达到的效果,以及其他优化相关的各种问题。这些目标需要明确指出(至少精通技术 的项目经理可以理解和表达它),接下来,在整个优化过程中,你需要坚持这些目标。
旧方案
for $ne in neList{ id= ne.id cls=ne.object_class alarm= alarmmap.get(id) //do some things
}
新方案
prepare:neMap for entry in alarmMap.entryset{
id= entry.key alarm= entry.value ne=neMap.get(id) cls=ne.object_class //do some things }
告警统计效率优化 数据:neList 1000w的网元集合,alarmMap<neId,alarm>10w的告警map
问题:根据object_class统计告警数,执行慢 方法:jstack,内存换效率 1.替换耗时的方法。 如:java的crc32换成 hadoop里的crc32 2.换一种思路实现,内存换效率
原生类型(primitive type)的内存占用如下:
Primitive Type Memory Required(bytes)
boolean
1
byte
1
short
2
char
2
int
4
float
4
long
8
double 8
reference类型在32位系统上每个占用4bytes, 在64位系统 上每个占用8bytes。
100个entries,cost 8.6k, 实际的double=2*100*8=1.6k
Double=16+8,double=8,67%额外开销
TreeMap包括: 48bytes+n*40bytes(entry)
double[]包括: 16+100*8
扩大数据量到1w
数据量增加额外开销并没有降低
如果是double[],数据量增加额外开销可以忽略不计
结论: 1. 集合带来便利的同时,有好多额外的开销 2. 选择适当的集合。 3. set底层为啥不用数组实现?map? 4. 100w以上数据考虑第三方集合实现Trove
DW缓存优化 封装完,代码量依然很大,而且日志不方便,继续拆分:
1.alarmService负责写操作,cacheService负责读操作
好处:
DW缓存优化
1.写和读分离
2.实时告警处理和告警查询日志分开
3.写增加线程处理,读增加cache处理
明确为什么优化。现场问题触发,维护工作量大等等
优化是要朝着好的方向发展而不是过度地优化,过度优化会降低程序 可读性,会给后期维护人员增加难度系数。满足实际需要即可,不要为 了优化而优化。 要对优化的对象,进行测试或者有一定的深入理解。有 些api人家的单线程效率就非常高,你为了优化,写了一堆多线程,然后 各种锁,各种问题。。。。。
2、选择正确的优化指标
选择正确的指标,是优化的一个重要组成部分,你需要按照这些指标来测量优化工作的进展情况。如 果指标选择不恰当,或者完全错误,你所做的努力有可能白费了。即使指标正确,也必须有一些辨别。 在某些情况下,将最多的努力投入到运行消耗时间最多的那部分代码中,这是实用的策略。但也要记住, Unix/Linux内核的大部分时间花费在了空循环上。需要注意的是,如果你轻易选择了一个很容易达到的 指标,这作用不大,因为没有真正解决问题。你有必要选择一个更复杂的、更接近你的目标的指标。
DW缓存优化
公共方法抽象 Cache分类实现 读写分离
DW缓存优化 1.1个类2000多行代码,好多重复操作,先抽象公共方法
Cache分类实现 1.AlarmCache在1406,ack,1409等各种消息里重复操作
2.ClearCache在1406,手动清除等各种消息重复操作
Cache分类实现 1.AlarmCache封装了活动告警/1409/清除告警的插入,活动放7天,清除3小时
Java代码优化
综合监控
代码优化原则 代码优化步骤 代码优化实践
代码优化
代码优化原则
代码优化是什么。代码优化是指对程序代码进行等价(指不改变程序 的运行结果)变换。程序代码可以是中间代码,也可以是目标代码。等 价的含义是使得变换后的代码运行结果与变换前代码运行结果相同。优 化的含义是最终生成的目标代码更加轻松自如(运行时间更短、占用空 间更小)地工作,时空效率优化。
3、找到优化的关键点
这是有效优化的关键。找到项目中与你的目标(性能、资源或其他)相背的地方,并将你的努力和 时间用在那里。举一个典型的例子,一个Web项目速度比较慢,开发者在优化时将大部分精力放在了数 据库优化上,最终发现真正的问题是网络连接慢。另外,不要分心于容易实现的问题。这些问题尽管很 容易解决,但可能不是必要的,或与你的目标不相符。容易优化并不意味着值得你花费工夫。
告警统计效率优化 其他方法:使用JavaVisualVM/Jprofiler查看方法耗时
DW线程优化 问题:DealThread,SendDataThread等都用Queue传递数据
方法:抽象、继承
DW线程优化
修改前
修改后
DW线程优化
抽象后可以 1.重复代码降低 2.统一的异常判断,catch 3.Package调整,统一的日志记录 4.统一的speed实现 5.统一的心跳信息处理
问题:运行一S段m时a间t内c存h溢e出r内存问题
方法:jmap
Smatcher内存问题 1.zkClient$7就是监听数据变更的通知对象
2.进一步查找:居然有1w多个监听器 3.日志:不停的有新客户端注册过来,其实是一样的,新注册就会添 加listener。。。
结论:查看代码修改注册机制
Java对象占用内存了解
使用java工具:jmap,jstack,jprofiler等
4、优化完后测试功能!
代码优化实践
运行更快 1.告警统计效率优化( jstack,内存换效率) 2.DataWorker线程抽象 3.DataWorker缓存读写分离 内存更小 1.Smatcher内存问题 2.Java对象占用内存 先预防,再优化
预防大于优化。
1、明确优化目标
代码优化步骤
在优化工作开始的时候,你还尚未明确优化内容和目的,那么你很容易陷入误区。在一开始,你就应 该清楚地了解你要达到的效果,以及其他优化相关的各种问题。这些目标需要明确指出(至少精通技术 的项目经理可以理解和表达它),接下来,在整个优化过程中,你需要坚持这些目标。
旧方案
for $ne in neList{ id= ne.id cls=ne.object_class alarm= alarmmap.get(id) //do some things
}
新方案
prepare:neMap for entry in alarmMap.entryset{
id= entry.key alarm= entry.value ne=neMap.get(id) cls=ne.object_class //do some things }
告警统计效率优化 数据:neList 1000w的网元集合,alarmMap<neId,alarm>10w的告警map
问题:根据object_class统计告警数,执行慢 方法:jstack,内存换效率 1.替换耗时的方法。 如:java的crc32换成 hadoop里的crc32 2.换一种思路实现,内存换效率
原生类型(primitive type)的内存占用如下:
Primitive Type Memory Required(bytes)
boolean
1
byte
1
short
2
char
2
int
4
float
4
long
8
double 8
reference类型在32位系统上每个占用4bytes, 在64位系统 上每个占用8bytes。
100个entries,cost 8.6k, 实际的double=2*100*8=1.6k
Double=16+8,double=8,67%额外开销
TreeMap包括: 48bytes+n*40bytes(entry)
double[]包括: 16+100*8
扩大数据量到1w
数据量增加额外开销并没有降低
如果是double[],数据量增加额外开销可以忽略不计
结论: 1. 集合带来便利的同时,有好多额外的开销 2. 选择适当的集合。 3. set底层为啥不用数组实现?map? 4. 100w以上数据考虑第三方集合实现Trove