发表于2024-11-18
1、系统介绍系统调优的解决思路和技术实现
2、结合大家熟知的12306、电商等案例
3、架构、设计、开发、算法等多层次多角度思路和策略
4、涉及内存、IO等各种问题,提供丰富的经验参考
5、语言通俗易懂,引人入胜
《大话Java性能优化》主要提供Java性能调优方面的参考建议及经验交流。作者力求做到知识的综合传播,而不是仅仅只针对Java虚拟机调优进行讲解,另外力求每一章节都有实际的案例支撑。具体包括:性能优化策略、程序编写及硬件服务器的基础知识、JavaAPI优化建议、算法类程序的优化建议、并行计算优化建议、Java程序性能监控及检测、JVM原理知识、其他相关优化知识等。
通读《大话Java性能优化》后,读者可以深入了解Java性能调优的许多主题及相关的综合性知识。读者也可以把《大话Java性能优化》作为参考,对于感兴趣的主题,直接跳到相应章节寻找答案。
总的来说,性能调优在很大程度上是一门艺术,解决的Java性能问题越多,技艺才会越精湛。我们不仅要关心JVM的持续演进,也要积极地去了解底层的硬件平台和操作系统的进步。
周明耀
12年投资银行项目、分布式计算项目工作经验,IBM开发者论坛专家作者。
一名IT技术狂热爱好者,一名顽强到底的工程师。推崇技术创新、思维创新,对于新技术非常的热爱,致力于技术研发、研究,通过发布文章、书籍、互动活动的形式积极推广软件技术。
欢迎添加作者微信“michael_tec”,共同探讨IT技术话题。
系统调优在软件的后续改进和重构中占有很大的地位,能够弥补前述的不足,本书以通俗的语言和引人入胜的故事,重点讲述软件性能调优的方法论和具体实现路径,读者可以根据自己的实际情况进行参照比对,就像进了兵器库挑选合适自己的顺手武器。
程序凑合着上线是一回事,而在压力下能够优美地运行往往很不容易。本书对于所有有志于进行软件高级管理的人员而言,具有非常重要的意义。
——海适云承CEO兼首席架构师 沈英桓(Sam Shen)
当我翻开周明耀先生编写的《大话Java性能优化》这本书时,一下子被他生动朴实的语言所深深吸引,他将生硬、深奥的IT系统技术问题深入浅出地层层剥开,娓娓道来,并结合时下大家熟知的12306、电商等案例,系统地分析和介绍了系统调优的重要性、解决思路和技术实现。
作为金融IT的一名同行,我对系统性能对用户体验和业务处理的重要性深有体会,尤其是高频交易系统(HFT),对系统性能的要求近乎苛刻,对业务的处理和响应要求毫秒级。本书作者从系统架构、系统设计、开发、编码、算法等多层次多角度提供思路和优化策略,是一本很务实的技术贴,值得大家学习、借鉴和探讨。
——德意志银行(中国)有限公司环球科技运营经理 黄正兵
在我自己使用Java开发项目的过程中,经常会切实地感受到系统调优的重要性。然而Java性能调优并不是一项一蹴而就的简单任务,而是如同并发编程需要关注算法、内存、I/O等各种问题以及丰富的经验积累。
本书中作者结合自己的实践经验总结了一些性能优化的方案。这些经验涉及Java基本语法、对象和引用、String类型和集合类的使用等各个方面且附有示例,使人受益匪浅,如果能够将其灵活运用到自己的系统中,相信能够对读者处理性能优化问题提供不小的帮助。此外,作者看待性能优化问题的视角相对开阔,系统且详尽地讨论了可能导致性能问题的各个环节和不同角度下性能优化的问题,读后令人豁然开朗。
——西安工业大学2016应届硕士毕业生 Fenny
第1章 性能调优策略概述 1
1.1 为什么需要调优 1
1.2 性能优化的参考因素 5
1.2.1 传统计算机体系的分歧 5
1.2.2 导致系统瓶颈的计算资源 7
1.2.3 程序性能衡量指标 8
1.2.4 性能优化目标 9
1.2.5 性能优化策略 10
1.3 性能调优分类方法 11
1.3.1 业务方面 12
1.3.2 基础技术方面 12
1.3.3 组件方面 17
1.3.4 架构方面 19
1.3.5 层次方面 20
1.4 本章小结 21
第2章 优化前的准备知识 22
2.1 服务器知识 23
2.1.1 内存 23
2.1.2 GPU/CPU 44
2.1.3 硬盘 49
2.1.4 网络架构 51
2.2 新兴技术 53
第3章 Java API调用优化建议 54
3.1 面向对象及基础类型 55
3.1.1 采用Clone()方式创建对象 55
3.1.2 避免对boolean判断 55
3.1.3 多用条件操作符 56
3.1.4 静态方法代替实例方法 56
3.1.5 有条件地使用final关键字 58
3.1.6 避免不需要的instanceof操作 58
3.1.7 避免子类中存在父类转换 59
3.1.8 建议多使用局部变量 60
3.1.9 运算效率最高的方式——位运算 60
3.1.10 用一维数组代替二维数组 62
3.1.11 布尔运算代替位运算 64
3.1.12 提取表达式优化 65
3.1.13 不要总是使用取反操作符(!) 66
3.1.14 不要重复初始化变量 66
3.1.15 变量初始化过程思考 66
3.1.16 对象的创建、访问过程 69
3.1.17 在switch语句中使用字符串 70
3.1.18 数值字面量的改进 73
3.1.19 优化变长参数的方法调用 74
3.1.20 针对基本数据类型的优化 75
3.1.21 空变量 76
3.2 集合类概念 77
3.2.1 快速删除List里面的数据 78
3.2.2 集合内部避免返回null 80
3.2.3 ArrayList、LinkedList比较 82
3.2.4 Vector、HashTable比较 85
3.2.5 HashMap使用经验 87
3.2.6 EnumSet、EnumMap 91
3.2.7 HashSet使用经验 92
3.2.8 LinkedHashMap、TreeMap比较 96
3.2.9 集合处理优化新方案 99
3.2.10 优先考虑并行计算 107
3.3 字符串概念 108
3.3.1 String对象 108
3.3.2 善用String对象的SubString方法 111
3.3.3 用charat()代替startswith() 113
3.3.4 在字符串相加的时候,使用' '代替" " 114
3.3.5 字符串切割 114
3.3.6 字符串重编码 117
3.3.7 合并字符串 118
3.3.8 正则表达式不是万能的 122
3.4 引用类型概念 123
3.4.1 强引用(Strong Reference) 126
3.4.2 软引用(Soft Reference) 131
3.4.3 弱引用(Weak Reference) 135
3.4.4 引用队列 141
3.4.5 虚引用(Phantom Reference) 142
3.5 其他相关概念 146
3.6 本章小结 175
第4章 程序设计优化建议 176
4.1 算法优化概述 176
4.2 设计模式 196
4.3 I/O及网络相关优化 225
4.5 其他优化 256
4.6 本章小结 269
第5章 Java并行程序优化建议 270
5.1 并行程序优化概述 270
5.1.8 线程池的使用 290
5.2 锁机制对比 296
5.3 增加程序并行性 310
5.4 JDK类库使用 319
5.5 本章小结 376
第6章 JVM性能测试及监控 377
6.1 监控计算机设备层 378
6.2 监控JVM活动 428
6.3 本章小结 438
第7章 JVM性能调优建议 439
7.1 JVM相关概念 439
7.2 JVM系统架构 451
7.3 垃圾回收机制相关 459
7.4 实用JVM实验 490
7.5 本章小结 515
第8章 其他优化建议 516
8.1 Java现有机制及未来发展 516
8.2 系统架构优化建议 528
8.3 与编程无关 546
8.4 本章小结
8.2.2.1 一般性软件项目优化案例
假设我们有这么一个项目,外部系统D通过系统对外提供的REST API接口从系统内部获取信息,从中提取出有效的信息,并通过JDBC存储到某数据库系统S中,以便供系统其他部分使用,上述操作的执行频率为每天一次,一般在午夜当系统空闲时定时执行。为了实现高可用性(High Availability),外部系统D部署在两台服务器上,因此需要分别从这两台服务器上获取信息并将信息插入数据库中,有效信息的条数达到了上千条,数据库插入操作次数则为有效信息条数的两倍。系统架构图如图8-1所示。
图8-1 系统架构图
为了快速地实现预期效果,在最初的实现中优先考虑了功能的实现,而未考虑系统性能和代码可读性等。系统大致有以下的实现。
(1)REST API获取信息、数据库操作可能抛出的异常信息都被记录到日志文件中,作为调试用。
(2)共有5次数据库连接操作,包括第一次清空数据库表,针对两个外部系统D各有两次数据库插入操作,这5个连接都是独立的,用完之后即释放。
(3)所有的数据库插入语句都是使用java.sql.Statement类生成的。
(4)所有的数据库插入语句,都是单条执行的,即生成一条执行一条。
(5)整个过程都是在单个线程中执行的,包括数据库表清空操作,数据库插入操作,释放数据库连接。
(6)数据库插入操作的JDBC代码散布在代码中。虽然这个版本的系统可以正常运行,达到了预期的效果,但是效率很低,从通过 REST API获取信息,到解析并提取有效信息,再到数据库插入操作,总共耗时100秒左右。而预期的时间应该在一分钟以内,这显然是不符合要求的。
开始分析整个过程有哪些耗时操作,以及如何提升效率,缩短程序执行的时间。通过REST API获取信息,因为是使用外部系统提供的API,所以无法在此处提升效率;取得信息之后解析出有效部分,因为是对特定格式的信息进行解析,所以也无效率提升的空间。综上所述,效率可以大幅度提升的空间在数据库操作部分以及程序控制部分。
针对日志的优化
因为从两台服务器的外部系统D上获取到的信息是相同的,所以数据库插入操作会抛出异常,异常信息类似于“Attempt to insert duplicate record”,这样的异常信息跟有效信息的条数相等,有上千条。这种情况是能预料到的,所以可以考虑关闭日志记录,或者不关闭日志记录而是更改日志输出级别,只记录严重级别(severe level)的错误信息,并将此类操作的日志级别调整为警告级别(warning level),这样就不会记录以上异常信息了。本项目使用的是 Java 自带的日志记录类,以下配置文件将日志输出级别设置为严重级别。
通过上述的优化之后,性能有了大幅度的提升,从原来的100秒左右降到了50秒左右。为什么仅仅不记录日志就能有如此大幅度的性能提升呢?查阅资料,发现已经有人做了相关的研究与实验。经常听到Java程序比C/C++程序慢的言论,但是运行速度慢的真正原因是什么,估计很多人并不清楚。对于CPU密集型的程序(即程序中包含大量计算),Java程序可以达到C/C++程序同等级别的速度,但是对于I/O密集型的程序(即程序中包含大量I/O操作),Java程序的速度就远远慢于C/C++程序了,很大程度上是因为C/C++程序能直接访问底层的存储设备。因此,不记录日志而得到大幅度性能提升的原因是,Java程序的I/O操作较慢,是一个很耗时的操作。
针对数据库连接的优化
假设程序中共有若干次数据库连接操作,每次都需重新建立数据库连接,数据库插入操作完成之后又立即释放了,数据库连接没有被复用。为了做到共享数据库连接,可以通过单例模式 (Singleton Pattern)获得一个相同的数据库连接,每次数据库连接操作都共享这个数据库连接。这里没有使用数据库连接池(Database Connection Pool)是因为在程序只有少量的数据库连接操作,只有在大量并发数据库连接的时候才需要连接池。
通过上述的优化之后,性能有了小幅度的提升,从50秒左右降到了40秒左右。共享数据库连接而得到的性能提升的原因是,数据库连接是一个耗时耗资源的操作,需要同远程计算机进行网络通信,建立TCP连接,还需要维护连接状态表,建立数据缓冲区。如果共享数据库连接,则只需要进行一次数据库连接操作,省去了多次重新建立数据库连接的时间。
针对数据库插入数据的优化
针对多线程的优化
......
序
最大的思想紊乱是相信人们想要相信的事情。
——路易斯?巴斯德(Louis Pasteuer)
Michael周是个具有丰富程序经历的架构师和项目管理者,他从国内作坊式的软件开发公司起步,经历了著名的咨询公司凯捷的欧洲工作洗礼,后来于美国花旗软件担任高级软件技术总监,平时常常思考和总结21世纪以来我国软件开发者,特别是Java开发工程师的困惑。
我们通常情况下,一开始可以有条不紊地进行软件需求定义和分析,随着上线时间的不断追近,面对客户的咄咄逼人的需求修改和即刻变更需求上线压力,程序员作为弱势群体,往往会考虑时间优先原则,很难守住按部就班的开发计划和开发方式,从而导致出现了软件质量的大幅度下降。软件一定存在修改的余地,但是程序员们通常不相信自己的系统存在诸多问题,尤其是感觉自己已经做得相当完美。系统调优在软件的后续改进和重构中占有很大的地位,能够弥补前述的不足,本书以通俗的语言和引人入胜的故事,重点讲述软件性能调优的方法论和具体实现路径,读者可以根据自己的实际情况进行参照比对,就像进了兵器库挑选合适自己的顺手武器。
程序凑合着上线是一回事,而能够优美地运行在压力下往往很不容易。本书对于所有有志于进行软件高级管理的人员而言,具有非常重要的意义。
海适云承CEO兼首席架构师 沈英桓(Sam Shen)
前 言
7岁那年,当我合上《上下五千年》一套三册书籍时,我对自己说,我想当个作家。这一晃27年了,等待了27年,我的第一本书《大话Java性能优化》即将面世了。我是多么的忐忑、惊喜,就像第一次面对我的女儿“小顽子”,给她取这个小名,希望她顽强到底,因为我相信,你若顽强到底,一切皆有可能。
从15岁拥有自己第一台电脑算起,已经有接近20年的计算机学习时间,加上11年的工作经历,我对于工作,对于工程师这个职业,有一些自己的感悟。我认为,职业素养非常重要。
1929年,在汪精卫的支持下,余云岫等人提出了全面废除中医、禁止中医的提案,并很快获得初审通过。在这样的局面下,全国各地中医师多次到南京请愿,虽有孙科等人的支持,但反响不大。相持阶段,无独有偶,汪精卫的岳母身患痢疾,西医师医治无效,京城四大名医之一的施今墨先生毅然赴汪府。施今墨凭脉,每言必中,使汪精卫的岳母心服口服,频频点头称是。处方时施今墨说:“安心服药,一诊可愈,不必复诊。”病危至此,一诊可愈?众人皆疑。据此处方仅服数剂,果如施今墨所言。汪精卫不得不服中医,最终撤回提案。施老先生医德高尚,死后遗体都捐献出来供科学研究,绝不是阿谀奉承之人,他赴汪府,完全是因为对中医生这个职业的尊重,为了让人知道中医的深奥。
戒口
佛教五戒之一的不妄语,要求我们不欺骗他人、不在不清楚实际情况的时候胡乱说话,放到职场,也可以加上信息安全的要求。
《越绝书》载文种述九术时说:“故曰九者勿患,戒口勿传,以取天下不难,况于吴乎?”文种希望勾践秘而不宣,以免人多口杂,泄露机密。每个人都有自己的岗位、职责,我们要做的是做好自己的事情,不对不属于自己工作范围内的事情评价、传播,不在背后说同事的坏话。作为一名技术人员,如果不能做到戒口、静心、专心,那我觉得你应该尽早转行,你不适合,也绝不会成为一名技术大拿。
气场
一位职业的工作者,他身上有一种称为气场的东西存在。人的气场是看不见的,但这种力量是巨大的,就像万有引力一样,我们每个人身上的这种气场无时无刻不在影响你的人生。这种气场的行程与你的观念、信仰、环境、朋友、呼吸、事物、欲望、静息与睡眠相关。一个人的气质很好,外表精神、有修养、有道德,这个人的气场就好,就会吸引好的事,吸引好的运气。每个人都会遇到各种各样的苦难,但是我坚信,你若顽强到底,一切皆有可能。
教养
看不见的教养很难。在乌合之众中谁能保持优雅和教养?在群体无意识中谁能保持清醒和判断?更难的是那些“慎独”的教养。日本有一种文化,叫作“不给别人添麻烦”的文化,我们每个人在做事之前都应该考虑是否自己的行为会给别人造成麻烦。教养不是道德规范,也不是小学生行为准则,其实也并不跟文化程度、社会发展、经济水平挂钩,它更是一种体谅,体谅别人的不容易,体谅别人的处境和习惯。对于教养,我个人的理解是,谦逊是一种教养,自尊更是。
心态
尼克?胡哲说过,人们经常埋怨什么也做不来,但如果我们只记挂着想拥有或欠缺的东西,而不去珍惜所拥有的,那根本改变不了问题!真正改变命运的,并不是我们的机遇,而是我们的态度。
一个人的心态很是重要,心量小的人,芝麻大小的事情也能在心里翻江倒海。心量大的人,即使在危机面前也能镇静自若。同样一件事情,掀起的波澜大小却因人而异。有一句话很好,用于技术人员我觉得尤其合适,“想要成为一棵大树,就不要去和草争”。
一个人的成就,不得以金钱衡量,而是一生中,你善待过多少人,有多少人怀念你。成功并非单指事业,无论是爱好或职业上的成功都只是成就。成功应该是多元化的,如人的一生包含了很多追求一样,而非单一指向。然后,无论你多有成就,真正的成功,就是陪伴家人。所有的情感都是需要陪伴的,这些陪伴成为一个个美好的回忆,这些都是整个家庭最宝贵、最重要的财富,这些远远超越 大话Java性能优化 下载 mobi epub pdf txt 电子书 格式
大话Java性能优化 下载 mobi pdf epub txt 电子书 格式 2024
大话Java性能优化 下载 mobi epub pdf 电子书好好好好?好好好好好好好好
评分打算学学java虚拟机,希望能用到
评分正版
评分大话Java性能优化
评分东西收到以后马上查看,发现与图片描述一致,超级喜欢,卖家发货速度很快,服务也很到位,给老板点个赞,下次还会来购买!
评分好评,最喜欢京东的图书满减了
评分不错,是正版,快递很给力,当天送达。
评分活动时买的,性价比真的超高!有几本书没有塑封,但是很干净!没有纸质没问题,可以接受的!快递非常快!很满意的满意的!这次买的书都很有意义!推荐品读!
评分正版
大话Java性能优化 mobi epub pdf txt 电子书 格式下载 2024