[ 收藏 ] [ 简体中文 ]  
臺灣貨到付款、ATM、超商、信用卡PAYPAL付款,4-7個工作日送達,999元臺幣免運費   在線留言 商品價格為新臺幣 
首頁 電影 連續劇 音樂 圖書 女裝 男裝 童裝 內衣 百貨家居 包包 女鞋 男鞋 童鞋 計算機周邊

商品搜索

 类 别:
 关键字:
    

商品分类

  •  管理

     一般管理学
     市场/营销
     会计
     金融/投资
     经管音像
     电子商务
     创业企业与企业家
     生产与运作管理
     商务沟通
     战略管理
     商业史传
     MBA
     管理信息系统
     工具书
     外文原版/影印版
     管理类职称考试
     WTO
     英文原版书-管理
  •  投资理财

     证券/股票
     投资指南
     理财技巧
     女性理财
     期货
     基金
     黄金投资
     外汇
     彩票
     保险
     购房置业
     纳税
     英文原版书-投资理财
  •  经济

     经济学理论
     经济通俗读物
     中国经济
     国际经济
     各部门经济
     经济史
     财政税收
     区域经济
     统计 审计
     贸易政策
     保险
     经济数学
     各流派经济学说
     经济法
     工具书
     通货膨胀
     财税外贸保险类考试
     英文原版书-经济
  •  社会科学

     语言文字
     社会学
     文化人类学/人口学
     新闻传播出版
     社会科学总论
     图书馆学/档案学
     经典名家作品集
     教育
     英文原版书-社会科学
  •  哲学

     哲学知识读物
     中国古代哲学
     世界哲学
     哲学与人生
     周易
     哲学理论
     伦理学
     哲学史
     美学
     中国近现代哲学
     逻辑学
     儒家
     道家
     思维科学
     马克思主义哲学
     经典作品及研究
     科学哲学
     教育哲学
     语言哲学
     比较哲学
  •  宗教

  •  心理学

  •  古籍

  •  文化

  •  历史

     历史普及读物
     中国史
     世界史
     文物考古
     史家名著
     历史地理
     史料典籍
     历史随笔
     逸闻野史
     地方史志
     史学理论
     民族史
     专业史
     英文原版书-历史
     口述史
  •  传记

  •  文学

  •  艺术

     摄影
     绘画
     小人书/连环画
     书法/篆刻
     艺术设计
     影视/媒体艺术
     音乐
     艺术理论
     收藏/鉴赏
     建筑艺术
     工艺美术
     世界各国艺术概况
     民间艺术
     雕塑
     戏剧艺术/舞台艺术
     艺术舞蹈
     艺术类考试
     人体艺术
     英文原版书-艺术
  •  青春文学

  •  文学

     中国现当代随笔
     文集
     中国古诗词
     外国随笔
     文学理论
     纪实文学
     文学评论与鉴赏
     中国现当代诗歌
     外国诗歌
     名家作品
     民间文学
     戏剧
     中国古代随笔
     文学类考试
     英文原版书-文学
  •  法律

     小说
     世界名著
     作品集
     中国古典小说
     四大名著
     中国当代小说
     外国小说
     科幻小说
     侦探/悬疑/推理
     情感
     魔幻小说
     社会
     武侠
     惊悚/恐怖
     历史
     影视小说
     官场小说
     职场小说
     中国近现代小说
     财经
     军事
  •  童书

  •  成功/励志

  •  政治

  •  军事

  •  科普读物

  •  计算机/网络

     程序设计
     移动开发
     人工智能
     办公软件
     数据库
     操作系统/系统开发
     网络与数据通信
     CAD CAM CAE
     计算机理论
     行业软件及应用
     项目管理 IT人文
     计算机考试认证
     图形处理 图形图像多媒体
     信息安全
     硬件
     项目管理IT人文
     网络与数据通信
     软件工程
     家庭与办公室用书
  •  建筑

  •  医学

     中医
     内科学
     其他临床医学
     外科学
     药学
     医技学
     妇产科学
     临床医学理论
     护理学
     基础医学
     预防医学/卫生学
     儿科学
     医学/药学考试
     医院管理
     其他医学读物
     医学工具书
  •  自然科学

     数学
     生物科学
     物理学
     天文学
     地球科学
     力学
     科技史
     化学
     总论
     自然科学类考试
     英文原版书-自然科学
  •  工业技术

     环境科学
     电子通信
     机械/仪表工业
     汽车与交通运输
     电工技术
     轻工业/手工业
     化学工业
     能源与动力工程
     航空/航天
     水利工程
     金属学与金属工艺
     一般工业技术
     原子能技术
     安全科学
     冶金工业
     矿业工程
     工具书/标准
     石油/天然气工业
     原版书
     武器工业
     英文原版书-工业技
  •  农业/林业

  •  外语

  •  考试

  •  教材

  •  工具书

  •  中小学用书

  •  中小学教科书

  •  动漫/幽默

  •  烹饪/美食

  •  时尚/美妆

  •  旅游/地图

  •  家庭/家居

  •  亲子/家教

  •  两性关系

  •  育儿/早教

     保健/养生
     体育/运动
     手工/DIY
     休闲/爱好
     英文原版书
     港台图书
     研究生
     工学
     公共课
     经济管理
     理学
     农学
     文法类
     医学
  • Java程序性能優化實戰
    該商品所屬分類:計算機/網絡 -> 程序設計
    【市場價】
    1313-1904
    【優惠價】
    821-1190
    【作者】 葛一鳴 
    【所屬類別】 圖書  計算機/網絡  程序設計  Java 
    【出版社】機械工業出版社 
    【ISBN】9787111669432
    【折扣說明】一次購物滿999元台幣免運費+贈品
    一次購物滿2000元台幣95折+免運費+贈品
    一次購物滿3000元台幣92折+免運費+贈品
    一次購物滿4000元台幣88折+免運費+贈品
    【本期贈品】①優質無紡布環保袋,做工棒!②品牌簽字筆 ③品牌手帕紙巾
    版本正版全新電子版PDF檔
    您已选择: 正版全新
    溫馨提示:如果有多種選項,請先選擇再點擊加入購物車。
    *. 電子圖書價格是0.69折,例如了得網價格是100元,電子書pdf的價格則是69元。
    *. 購買電子書不支持貨到付款,購買時選擇atm或者超商、PayPal付款。付款後1-24小時內通過郵件傳輸給您。
    *. 如果收到的電子書不滿意,可以聯絡我們退款。謝謝。
    內容介紹



    開本:16開
    紙張:膠版紙
    包裝:平裝-膠訂

    是否套裝:否
    國際標準書號ISBN:9787111669432
    作者:葛一鳴

    出版社:機械工業出版社
    出版時間:2020年08月 

        
        
    "

    產品特色

    編輯推薦

    作者是國家認證繫統分析師、Oracle數據庫認證專家(OCP),長期從事Java開發,對Java程序設計和JVM有深入研究。


    感受Java開發中的大智慧,讓你的Java程序更優美


    資深程序員深度分享Java程序性能優化的寶貴經驗


    從軟件設計、編碼和JVM等維度闡述性能優化的方法和技巧


    通過大量示例,全方位展現Java程序性能優化的技巧;


    專注於Java程序性能優化的方法、技巧和思想,深度剖析JDK部分的實現;


    深入剖析軟件設計層面、代碼層面、JVM虛擬機層面的優化方法;


    理論結合實踐,真正將性能優化的相關技巧應用到實踐中。

     
    內容簡介

    Java是目前應用非常廣泛的軟件開發平臺,學習針對Java程序的優化方法有重要的現實意義。本書以Java程序性能優化為主線,繫統地闡述與其相關的知識點,幫助讀者掌握編寫高質量Java程序的技巧,讓他們感受Java開發中的大智慧,編寫出更加優美的程序。


    《Java程序性能優化實戰》共6章,從軟件設計、軟件編碼、JVM調優及程序故障排除等方面介紹Java程序性能優化的方法。第1章介紹性能的基本概念、木桶原理、Amdahl定律,以及繫統調優的步驟和注意事項;第2章從設計層面介紹與性能相關的設計模式及常用的優化組件;第3章從代碼層面介紹如何編寫高性能的Java程序;第4章介紹並行程序開發,以及如何通過多線程提高繫統的性能;第5章立足於JVM 虛擬機層面,介紹如何通過設置合理的JVM參數提升Java程序的性能;第6章介紹獲取和監控程序及繫統性能指標的各種工具,包括相關的故障排查工具。


    《Java程序性能優化實戰》適合所有的Java程序員、軟件設計師、架構師及軟件開發愛好者閱讀。對於有一定經驗的Java工程師,本書能幫助他們突破技術瓶頸,提高開發水平。

    作者簡介

    葛一鳴  國家認證繫統分析師,Oracle數據庫認證專家(OCP)。長期從事Java軟件開發,對Java程序設計和JVM有深入的研究,對設計模式、人工智能、神經網絡和數據挖掘等技術有濃厚的興趣。目前專注於JVM培訓,學員累計超過萬人。

    目錄
    前言
    第1章 Java性能調優概述 1
    1.1 性能概述 1
    1.1.1 看懂程序的性能 1
    1.1.2 性能的參考指標 2
    1.1.3 木桶原理與性能瓶頸 2
    1.1.4 Amdahl定律 3
    1.2 性能調優的層次 5
    1.2.1 設計調優 5
    1.2.2 代碼調優 6
    1.2.3 JVM調優 6
    1.2.4 數據庫調優 6
    1.2.5 操作繫統調優 7
    1.3 基本調優策略和手段 7

    前言


    第1章  Java性能調優概述       1


    1.1  性能概述      1


    1.1.1  看懂程序的性能       1


    1.1.2  性能的參考指標       2


    1.1.3  木桶原理與性能瓶頸       2


    1.1.4  Amdahl定律     3


    1.2  性能調優的層次   5


    1.2.1  設計調優   5


    1.2.2  代碼調優   6


    1.2.3  JVM調優   6


    1.2.4  數據庫調優       6


    1.2.5  操作繫統調優   7


    1.3  基本調優策略和手段   7


    1.3.1  優化的一般步驟       8


    1.3.2  繫統優化的注意事項       8


    1.4  小結      9


    第2章  設計優化       10


    2.1  善用設計模式      10


    2.1.1  單例模式   10


    2.1.2  代理模式   15


    2.1.3 模式   24


    2.1.4  裝飾者模式       28


    2.1.5  觀察者模式       34


    2.1.6  值對像模式       38


    2.1.7  業務代理模式   41


    2.2  常用的優化組件和方法      44


    2.2.1  緩衝   44


    2.2.2  緩存   47


    2.2.3  對像復用——池       51


    2.2.4  並行替代串行   58


    2.2.5  負載均衡   58


    2.2.6  時間換空間       63


    2.2.7  空間換時間       64


    2.3  小結      66


    第3章  Java程序優化       67


    3.1  字符串優化處理   67


    3.1.1  String對像及其特點 67


    3.1.2  substring()方法的內存洩漏      69


    3.1.3  字符串分割和查找   72


    3.1.4  StringBuffer和StringBuilder   76


    3.1.5  CompactStrings優化字符串存儲     80


    3.2  核心數據結構      81


    3.2.1  List接口    81


    3.2.2  Map接口   88


    3.2.3  Set接口     100


    3.2.4  優化集合訪問代碼   101


    3.2.5  RandomAccess接口  103


    3.3  使用NIO提升性能     105


    3.3.1  NIO中的Buffer類族和Channel     106


    3.3.2  Buffer的基本原理    107


    3.3.3  Buffer的相關操作    109


    3.3.4  MappedByteBuffer性能評估    116


    3.3.5  直接訪問內存   119


    3.4  引用類型      121


    3.4.1  強引用       121


    3.4.2  軟引用       122


    3.4.3  弱引用       123


    3.4.4  虛引用       124


    3.4.5  WeakHashMap類及其實現      127


    3.5  性能測試工具JMH     129


    3.5.1  JMH之Hello World  130


    3.5.2  JMH之指定測量模式      131


    3.5.3  JMH之對像作用域   134


    3.5.4  JMH之代碼消除      135


    3.6  有助於改善性能的技巧      137


    3.6.1  使用局部變量   137


    3.6.2  位運算代替乘除法   138


    3.6.3  替換switch 139


    3.6.4  一維數組代替二維數組   141


    3.6.5  提取表達式       142


    3.6.6  展開循環   143


    3.6.7  布爾運算代替位運算       144


    3.6.8  使用arrayCopy()      145


    3.6.9  使用Buffer進行I/O操作       147


    3.6.10  使用clone()代替new     149


    3.6.11  慎用Java函數式編程     151


    3.7  小結      152


    第4章  並行程序開發及優化    153


    4.1  並行程序設計模式      153


    4.1.1  Future模式       153


    4.1.2  Master-Worker模式  161


    4.1.3  Guarded Suspension模式  165


    4.1.4  不變模式   172


    4.1.5  生產者-消費者模式  174


    4.2  JDK多任務執行框架  178


    4.2.1  無限制線程的缺陷   178


    4.2.2  簡單的線程池實現   179


    4.2.3  Executor框架    183


    4.2.4  自定義線程池   185


    4.2.5  優化線程池大小       189


    4.2.6  擴展ThreadPoolExecutor  189


    4.3  JDK並發數據結構      191


    4.3.1  並發List    191


    4.3.2  並發Set     193


    4.3.3  並發Map   194


    4.3.4  並發Queue 195


    4.3.5  並發Deque 197


    4.4  並發控制方法      199


    4.4.1  Java內存模型與volatile   199


    4.4.2  同步關鍵字synchronized  203


    4.4.3  重入鎖       205


    4.4.4  讀寫鎖       207


    4.4.5  讀寫鎖的改進:StampedLock  209


    4.4.6  Condition對像   210


    4.4.7  信號量       212


    4.4.8  線程局部變量ThreadLocal      214


    4.5  鎖的性能和優化   215


    4.5.1  線程的開銷       215


    4.5.2  避免死鎖   215


    4.5.3  減少鎖持有時間       219


    4.5.4  減小鎖粒度       220


    4.5.5  讀寫分離鎖來替換獨占鎖       221


    4.5.6  鎖分離       222


    4.5.7  重入鎖和內部鎖       224


    4.5.8  鎖粗化       224


    4.5.9  自旋鎖       226


    4.5.10  鎖消除     226


    4.5.11  鎖偏向     227


    4.6  無鎖的並行計算   228


    4.6.1  非阻塞的同步/無鎖  228


    4.6.2  原子操作   228


    4.6.3  Amino框架簡介       231


    4.6.4  Amino集合       231


    4.6.5  Amino樹   236


    4.6.6  Amino圖   237


    4.6.7  Amino簡單調度模式       238


    4.7  協程      240


    4.7.1  協程的概念       240


    4.7.2  Kilim框架簡介 241


    4.7.3  Task及其狀態   242


    4.7.4  Fiber及其狀態  242


    4.7.5  Kilim開發環境配置 243


    4.7.6  Kilim之Hello World 244


    4.7.7  多任務通信       246


    4.7.8  Kilim實例及性能評估     247


    4.8  小結      250


    第5章  JVM調優       251


    5.1  Java虛擬機內存模型   251


    5.1.1  程序計數器       251


    5.1.2  Java虛擬機棧   252


    5.1.3  本地方法棧       258


    5.1.4  Java堆       258


    5.1.5  方法區       260


    5.2  JVM內存分配參數     263


    5.2.1  設置堆內存       264


    5.2.2  設置小堆內存       264


    5.2.3  設置新生代       266


    5.2.4  設置持久代       266


    5.2.5  設置線程棧       267


    5.2.6  堆的比例分配   269


    5.2.7  堆分配參數總結       270


    5.3  垃圾收集基礎      271


    5.3.1  垃圾收集的作用       272


    5.3.2  垃圾回收算法與思想       272


    5.3.3  垃圾回收器的類型   277


    5.3.4  評價GC策略的指標 278


    5.3.5  新生代串行回收器   278


    5.3.6  老年代串行回收器   279


    5.3.7  並行回收器       280


    5.3.8  新生代並行回收器   281


    5.3.9  老年代並行回收器   282


    5.3.10  CMS回收器    282


    5.3.11  G1回收器       285


    5.3.12  Stop the World案例       286


    5.3.13  垃圾回收器對繫統性能的影響     288


    5.3.14  GC操作相關參數總結   289


    5.4  常用調優案例和方法   291


    5.4.1  將新對像預留在新生代   291


    5.4.2  大對像進入老年代   294


    5.4.3  設置對像進入老年代的年齡   296


    5.4.4  穩定與振蕩的堆大小       296


    5.4.5  吞吐量優先案例       298


    5.4.6  使用大頁案例   298


    5.4.7  降低停頓案例   299


    5.5  實用JVM參數     299


    5.5.1  JIT編譯參數     299


    5.5.2  堆快照       301


    5.5.3  錯誤處理   302


    5.5.4  獲取GC信息    302


    5.5.5  類和對像跟蹤   304


    5.5.6  控制GC     305


    5.5.7  選擇類校驗器   305


    5.5.8  Solaris下的線程控制       306


    5.5.9  使用大頁   306


    5.5.10  壓縮指針  306


    5.6  JVM調優實戰     306


    5.6.1  Tomcat簡介與啟動加速   307


    5.6.2  Web應用程序簡介   309


    5.6.3  JMeter簡介與使用   310


    5.6.4  調優前Web應用運行狀況      313


    5.6.5  調優過程   314


    5.7  小結      315


    第6章  Java性能調優工具       316


    6.1  Linux命令行工具 316


    6.1.1  top命令     316


    6.1.2  sar命令      318


    6.1.3  vmstat命令       319


    6.1.4  iostat命令  321


    6.1.5  pidstat工具       322


    6.2  Windows工具      326


    6.2.1  任務管理器       326


    6.2.2  perfmon性能監控工具     328


    6.2.3  Process Explorer工具       331


    6.2.4  pslist命令行      333


    6.3  JDK命令行工具  334


    6.3.1  jps命令      335


    6.3.2  jstat命令    336


    6.3.3  jinfo命令   339


    6.3.4  jmap命令   340


    6.3.5  jhat命令    341


    6.3.6  jstack命令  343


    6.3.7  jstatd命令  346


    6.3.8  hprof工具  347


    6.3.9  jcmd命令   349


    6.4  JConsole工具       350


    6.4.1  JConsole連接Java程序   350


    6.4.2  Java程序概況   351


    6.4.3  內存監控   352


    6.4.4  線程監控   352


    6.4.5  類加載情況       354


    6.4.6  虛擬機信息       354


    6.4.7  MBean管理       355


    6.4.8  使用插件   356


    6.5  Visual VM多合一工具 357


    6.5.1  Visual VM連接應用程序 358


    6.5.2  監控應用程序概況   359


    6.5.3  Thread Dump和分析 361


    6.5.4  性能分析   362


    6.5.5  快照   365


    6.5.6  內存快照分析   365


    6.5.7  MBean管理功能       367


    6.5.8  TDA的使用      367


    6.5.9  BTrace簡介       368


    6.6  Visual VM對OQL的支持   374


    6.6.1  Visual VM的OQL基本語法   374


    6.6.2  內置heap對像  375


    6.6.3  對像函數   376


    6.6.4  集合/統計函數  380


    6.6.5  程序化OQL      384


    6.7  MAT內存分析工具     386


    6.7.1  初識MAT   386


    6.7.2  淺堆和深堆       389


    6.7.3  支配樹       392


    6.7.4  垃圾回收根       394


    6.7.5  內存洩漏檢測   395


    6.7.6  對像報告   396


    6.7.7  查找支配者       396


    6.7.8  線程分析   397


    6.7.9  集合使用情況分析   398


    6.7.10  擴展MAT 399


    6.8  MAT對OQL的支持    403


    6.8.1  Select子句 404


    6.8.2  From子句  406


    6.8.3  Where子句       407


    6.8.4  內置對像與方法       408


    6.9  來自JRockit的禮物——JMC     411


    6.9.1  得到JFR文件   412


    6.9.2  Java程序的整體運行情況       413


    6.9.3  CPU分析   413


    6.9.4  內存分析   414


    6.9.5  I/O分析     416


    6.10  小結    418

    前言
    Java是目前應用為廣泛的軟件開發平臺之一。隨著Java及Java社區的不斷壯大,Java早已不再是一門簡單的計算機語言了,它更是一個平臺、一種文化、一個社區。
    作為一個平臺,JVM虛擬機起著舉足輕重的作用。除了Java語言,任何一種能夠被編譯成字節碼的計算機語言都屬於Java這個平臺。Groovy、Scala和JRuby等都是Java平臺的一部分,它們依賴於JVM虛擬機,同時,Java平臺也因為它們而變得更加豐富多彩。
    作為一種文化,Java幾乎成為“開源”的代名詞。在Java平臺上,有大量的開源軟件和框架,如Tomcat、Struts、Hibernate和Spring等。就連JDK和JVM自身也有不少的開源實現版本,如OpenJDK和Harmony。可以說,“共享”的精神在Java世界裡體現得淋漓盡致。
    作為一個社區,Java擁有無數的開發人員、數不清的論壇和資料。從桌面應用軟件和嵌入式開發,到企業級應用、後臺服務器和中間件,都可以看到Java的身影。其應用形式之復雜、參與人數之龐大也令人咂舌。可以說,Java社區已經成為一個良好而龐大的生態繫統。
    《Java程序性能優化實戰》特色
    《Java程序性能優化實戰》的主要特色有:

    Java是目前應用為廣泛的軟件開發平臺之一。隨著Java及Java社區的不斷壯大,Java早已不再是一門簡單的計算機語言了,它更是一個平臺、一種文化、一個社區。


    作為一個平臺,JVM虛擬機起著舉足輕重的作用。除了Java語言,任何一種能夠被編譯成字節碼的計算機語言都屬於Java這個平臺。Groovy、Scala和JRuby等都是Java平臺的一部分,它們依賴於JVM虛擬機,同時,Java平臺也因為它們而變得更加豐富多彩。


    作為一種文化,Java幾乎成為“開源”的代名詞。在Java平臺上,有大量的開源軟件和框架,如Tomcat、Struts、Hibernate和Spring等。就連JDK和JVM自身也有不少的開源實現版本,如OpenJDK和Harmony。可以說,“共享”的精神在Java世界裡體現得淋漓盡致。


    作為一個社區,Java擁有無數的開發人員、數不清的論壇和資料。從桌面應用軟件和嵌入式開發,到企業級應用、後臺服務器和中間件,都可以看到Java的身影。其應用形式之復雜、參與人數之龐大也令人咂舌。可以說,Java社區已經成為一個良好而龐大的生態繫統。


    《Java程序性能優化實戰》特色


    《Java程序性能優化實戰》的主要特色有:


    專注於Java應用程序的優化方法、技巧和思想,並深度剖析JDK部分的實現。


    具有較強的層次性和連貫性,深入剖析軟件設計層面、代碼層面和JVM虛擬機層面的優化方法。


    理論結合實踐,使用豐富的示例幫助讀者理解理論知識。


    《Java程序性能優化實戰》內容


    《Java程序性能優化實戰》主要介紹Java應用程序的優化方法和技巧,共分為6章。


    第1章介紹性能的基本概念、兩個重要理論(木桶原理和Amdahl定律),以及繫統調優的一般步驟與注意事項。


    第2章從設計層面介紹與性能相關的設計模式、組件及有助於改善性能的軟件設計思想。


    第3章從代碼層面介紹如何編寫高性能的Java代碼,涉及的主要內容有字符串的優化處理、文件I/O的優化、核心數據結構的使用、Java的引用類型及一些常用的慣例。


    第4章介紹並行程序開發的相關知識,以及如何通過多線程提高繫統性能,涉及的主要內容有並發設計模式、多任務執行框架、並發數據結構的使用、並發控制方法、“鎖”的優化、無鎖的並行計算及協程。


    第5章立足於JVM虛擬機層面,介紹如何通過設置合理的JVM參數提升Java程序的性能。


    第6章主要介紹獲取和監控程序或繫統性能指標的各種工具,以及Java應用程序相關的故障排查工具。


    讀者對像


    想要通讀本書並取得良好的學習效果,讀者需要具備Java的基礎知識。本書不是一本幫助Java初學者入門的書籍,而是一本介紹如何編寫高質量Java程序的書籍,主要適合以下讀者閱讀:


    擁有一定開發經驗的Java開發人員;


    Java軟件設計師和架構師;


     繫統調優人員;


     有一定Java語言基礎而想進一步提高開發水平的程序員。


    《Java程序性能優化實戰》約定


    《Java程序性能優化實戰》在講解的過程中有如下約定:


    書中所述的JDK 1.5、JDK 1.6、JDK 1.7和JDK 1.8,分別等同於JDK 5、JDK 6、JDK 7和JDK 8。


    如無特殊說明,JVM虛擬機均指Hot Spot虛擬機。


    如無特殊說明,《Java程序性能優化實戰》中的程序和示例均可在JDK 1.6、JDK 1.7和JDK 1.8環境中運行。


    配書資源獲取方式


    《Java程序性能優化實戰》涉及的所有源代碼需要讀者自行下載。請在華章公司的網站(www.hzbook.com)上搜索到本書,然後單擊“資料下載”按鈕,即可在本書頁面上找到下載鏈接。


    致謝


    在《Java程序性能優化實戰》的寫作過程中,我充滿著感激之情。首先感謝我的家人!在本書完稿前,父親病重,但由於我的工作繁忙,未能抽出太多時間照顧他,幸好得到了母親的大力支持和父親的諒解,我纔能夠全身心投入到寫作之中。同時,母親對我的悉心照料也讓我能夠更加專注於寫作。


    其次,感謝我的工作單位UT斯達康對我的支持和理解,讓我能安心寫作。另外,還要感謝兩位前輩Rex Zhu和Tao Tao!正是他們在工作中對我的悉心指導,纔能讓我有所進步,而這一切,正是寫作本書的基礎。


    後,再次感謝我的母親,祝她身體健康!


    售後支持


    Java程序性能優化涉及的知識較為龐雜,而且Java技術也在不斷地迭代和發展,加之筆者水平和成書時間所限,書中可能存在一些疏漏和不當之處,敬請各位讀者指正。閱讀本書時若有疑問,請發電子郵件到hzbook2017@163.com。


    ……

    媒體評論
    目前,市面上為數不多的講解Java程序性能優化的圖書內容不夠深入,講解也不夠淺顯易懂,有的甚至晦澀難懂。而本書不存在這些問題。本書結合作者多年的Java開發經驗和對Java繫統的深入理解,由淺入深地闡述Java程序性能優化的方法、技巧和思想,並通過大量示例展現各種參數帶來的優化效果,從而幫助讀者透徹地理解Java程序性能優化的要點,值得每一個Java程序員細讀。
    ——中國聯通濟南軟件研究院 郝軍
    Java程序性能優化雖然是一個老生常談的話題,但想要把這個話題真正講解清楚卻並不容易。本書讓人眼前一亮,很多困擾Java程序員的問題都能在書中找到答案。本書對軟件設計優化、編碼優化及JVM虛擬機優化均做了深入講解,基本涵蓋了Java程序性能優化的重要知識點,推薦想提升Java程序開發水平的程序員閱讀。
    ——財神軟件架構師 張蓉
    本書總結了葛老師多年從事Java開發及培訓的大量經驗,並給出了他對軟件架構、設計和優化等方面的建議,是一本凝聚了大量心血的誠意之作。本書通過大量示例深入剖析Java底層設計和架構,並對Java程序性能優化的技巧做了重點闡述,可以幫助讀者提高Java開發水平,從而編寫出更加健壯和優美的程序。

    目前,市面上為數不多的講解Java程序性能優化的圖書內容不夠深入,講解也不夠淺顯易懂,有的甚至晦澀難懂。而本書不存在這些問題。本書結合作者多年的Java開發經驗和對Java繫統的深入理解,由淺入深地闡述Java程序性能優化的方法、技巧和思想,並通過大量示例展現各種參數帶來的優化效果,從而幫助讀者透徹地理解Java程序性能優化的要點,值得每一個Java程序員細讀。


    ——中國聯通濟南軟件研究院  郝軍


    Java程序性能優化雖然是一個老生常談的話題,但想要把這個話題真正講解清楚卻並不容易。本書讓人眼前一亮,很多困擾Java程序員的問題都能在書中找到答案。本書對軟件設計優化、編碼優化及JVM虛擬機優化均做了深入講解,基本涵蓋了Java程序性能優化的重要知識點,推薦想提升Java程序開發水平的程序員閱讀。


    ——財神軟件架構師  張蓉


    本書總結了葛老師多年從事Java開發及培訓的大量經驗,並給出了他對軟件架構、設計和優化等方面的建議,是一本凝聚了大量心血的誠意之作。本書通過大量示例深入剖析Java底層設計和架構,並對Java程序性能優化的技巧做了重點闡述,可以幫助讀者提高Java開發水平,從而編寫出更加健壯和優美的程序。


    ——本書的*個讀者  靳華

    在線試讀
    第1章 Java性能調優概述
    本章將對性能優化技術進行整體性概述,讓讀者了解性能的概念和性能優化的基本思路和方法。掌握這些內容,有助於讀者對性能問題進行繫統分析。
    本章涉及的主要知識點有:
    ? 評價性能的主要指標;
    ? 木桶原理的概念及其在性能優化中的應用;
    ? Amdahl定律的含義;
    ? 性能調優的層次;
    ? 繫統優化的一般步驟和注意事項。
    1.1 性 能 概 述
    為什麼程序總是那麼慢?它現在到底在干什麼?時間都耗費在哪裡了?也許,你經常會抱怨這些問題。如果是這樣,那麼說明你的程序出現了性能問題。和功能性問題相比,性能問題在有些情況下可能並不算什麼太大的問題,將就將就,也就過去了。但是,嚴重的性能問題會導致程序癱瘓、假死,直至崩潰。本節就先來認識性能的各種表現和指標。
    1.1.1 看懂程序的性能
    對於客戶端程序而言,拙劣的性能會嚴重影響用戶體驗。界面停頓、抖動、響應遲鈍等問題會遭到用戶不停地抱怨。一個典型的例子就是Eclipse IDE工具在執行Full GC時會出現程序“假死”現像,相信這一定被不少開發人員所詬病。對於服務器程序來說,性能問題則更為重要。相信不少後臺服務器軟件都有各自的性能目標,以Web服務器為例,服務器的響應時間和吞吐量就是兩個重要的性能參數。當服務器承受巨大的訪問壓力時,可能出現響應時間變長、吞吐量下降,甚至拋出內存溢出異常而崩潰等問題。這些問題,都是性能調優需要解決的。
    一般來說,程序的性能可以有以下幾個方面的表現。
    ? 執行速度:程序的反應是否迅速,響應時間是否足夠短。
    ? 內存分配:內存分配是否合理,是否過多地消耗內存或者存在洩漏。

    第1章  Java性能調優概述
    本章將對性能優化技術進行整體性概述,讓讀者了解性能的概念和性能優化的基本思路和方法。掌握這些內容,有助於讀者對性能問題進行繫統分析。
    本章涉及的主要知識點有:
    ? 評價性能的主要指標;
    ? 木桶原理的概念及其在性能優化中的應用;
    ? Amdahl定律的含義;
    ? 性能調優的層次;
    ? 繫統優化的一般步驟和注意事項。
    1.1  性 能 概 述
    為什麼程序總是那麼慢?它現在到底在干什麼?時間都耗費在哪裡了?也許,你經常會抱怨這些問題。如果是這樣,那麼說明你的程序出現了性能問題。和功能性問題相比,性能問題在有些情況下可能並不算什麼太大的問題,將就將就,也就過去了。但是,嚴重的性能問題會導致程序癱瘓、假死,直至崩潰。本節就先來認識性能的各種表現和指標。
    1.1.1  看懂程序的性能
    對於客戶端程序而言,拙劣的性能會嚴重影響用戶體驗。界面停頓、抖動、響應遲鈍等問題會遭到用戶不停地抱怨。一個典型的例子就是Eclipse IDE工具在執行Full GC時會出現程序“假死”現像,相信這一定被不少開發人員所詬病。對於服務器程序來說,性能問題則更為重要。相信不少後臺服務器軟件都有各自的性能目標,以Web服務器為例,服務器的響應時間和吞吐量就是兩個重要的性能參數。當服務器承受巨大的訪問壓力時,可能出現響應時間變長、吞吐量下降,甚至拋出內存溢出異常而崩潰等問題。這些問題,都是性能調優需要解決的。
    一般來說,程序的性能可以有以下幾個方面的表現。
    ? 執行速度:程序的反應是否迅速,響應時間是否足夠短。
    ? 內存分配:內存分配是否合理,是否過多地消耗內存或者存在洩漏。
    ? 啟動時間:程序從運行到可以正常處理業務需要花費多長時間。
    ? 負載承受能力:當繫統壓力上升時,繫統的執行速度和響應時間的上升曲線是否平緩。
    1.1.2  性能的參考指標
    為了能夠科學地進行性能分析,對性能指標進行定量評測是非常重要的。目前,可以用於定量評測的性能指標有:
    ? 執行時間:一段代碼從開始運行到運行結束所使用的時間。
    ? CPU時間:函數或者線程占用CPU的時間。
    ? 內存分配:程序在運行時占用的內存空間。
    ? 磁盤吞吐量:描述I/O的使用情況。
    ? 網絡吞吐量:描述網絡的使用情況。
    ? 響應時間:繫統對某用戶行為或者事件做出響應的時間。響應時間越短,性能越好。
    1.1.3  木桶原理與性能瓶頸
    木桶原理又稱短板理論,其核心思想是一隻木桶盛水的多少,並不取決於桶壁上的那塊木板,而是取決於桶壁上短的那塊木板,如圖1.1所示。
    將這個理論應用到繫統性能優化上可以這麼理解,即使繫統擁有充足的內存資源和CPU資源,但是,如果磁盤I/O性能低下,那麼繫統的總體性能是取決於當前慢的磁盤I/O速度,而不是當前越的CPU或者內存。在這種情況下,如果需要進一步提升繫統性能,優化內存或者CPU資源是毫無用處的,隻有提高磁盤I/O性能纔能對繫統的整體性能進行優化。此時,磁盤I/O就是繫統的性能瓶頸。
    ?注意:根據木桶原理,繫統的終性能取決於繫統中性能表現差的組件。因此,為了提升繫統的整體性能,必須對繫統中表現差的組件進行優化,而不是對繫統中表現良好的組件進行優化。
    根據應用的特點不同,任何計算機資源都有可能成為繫統瓶頸。其中,有可能成為繫統瓶頸的計算資源有:
    ? 磁盤I/O:由於磁盤I/O讀寫的速度比內存慢很多,程序在運行過程中,如果需要等待磁盤I/O完成,那麼低效的I/O操作會拖累整個繫統。
    ? 網絡操作:對網絡數據進行讀寫的情況與磁盤I/O類似,由於網絡環境的不確定性,尤其是對互聯網上數據的讀寫,網絡操作的速度可能比本地磁盤I/O更慢,因此,如不加特殊處理,也極可能成為繫統瓶頸。
    ? CPU:對計算資源要求較高的應用,由於其長時間、不間斷地大量占用CPU資源,那麼對CPU的爭奪將導致性能問題。例如,科學計算、3D渲染等對CPU需求量大的應用便是如此。
    ? 異常:對Java應用來說,異常的捕獲和處理是非常消耗資源的。如果程序高頻率地進行異常處理,則整體性能便會有明顯下降。
    ? 數據庫:大部分應用程序都離不開數據庫,而海量數據的讀寫操作往往是相當費時的。應用程序需要等待數據庫操作完成並返回結果,那麼緩慢的同步操作將成為繫統瓶頸。
    ? 鎖競爭:對高並發程序來說,如果存在激烈的鎖競爭,對性能無疑是極大的打擊。鎖競爭將會明顯增加線程上下文切換的開銷,而且這些開銷都是與應用需求無關的繫統開銷,白白占用寶貴的CPU資源,卻不帶來任何好處。
    ? 內存:一般來說,隻要應用程序設計合理,內存在讀寫速度上不太可能成為性能瓶頸。除非應用程序進行了高頻率的內存交換和掃描,但這種情況比較少見。內存制約繫統性能有可能出現的情況是內存容量不足。與磁盤相比,內存的容量似乎小得可憐,這意味著應用軟件隻能盡可能將常用的核心數據讀入內存,這在一定程度上降低了繫統性能。
    1.1.4  Amdahl定律
    Amdahl定律是計算機科學中非常重要的定律,它定義了串行繫統並行化後的加速比的計算公式和理論上限。
    加速比定義如下:
    加速比=優化前繫統耗時/優化後繫統耗時
    即所謂的加速比,就是優化前繫統耗時與優化後繫統耗時的比值。加速比越高,表明優化效果越明顯。
    Amdahl定律給出了加速比與繫統並行度和處理器數量的關繫。設加速比為Speedup,繫統內必須串行化的程序比重為F,CPU處理器的數量為N,則有
     
    根據這個公式可知,如果CPU處理器的數量趨於無窮,那麼加速比與繫統的串行化率成反比,如果繫統中必須有50%的代碼串行執行,那麼繫統的加速比為2。
    假設有一程序分為5個步驟執行,每個執行步驟花費100個時間單位。其中,隻有步驟2和步驟5可以進行並行,步驟1、3、4必須串行,如圖1.2所示。在全串行的情況下,繫統合計耗時500個時間單位。
     
    圖1.2  串行工作流程
    若將步驟2和步驟5並行化,假設在雙核處理器上,則有如圖1.3所示的處理流程。在這種情況下,步驟2和步驟5的耗時將為50個時間單位,故繫統整體耗時為400個時間單位。根據加速比的定義有:
    加速比=優化前繫統耗時/優化後繫統耗時=500/400=1.25
    或者使用Amdahl定律給出的加速比公式。由於5個步驟中,3個步驟必須串行,因此其串行化比重為3/5=0.6,即F=0.6,且雙核處理器的處理器個數N為2。代入公式得:
    加速比=1/(0.6 (1-0.6)/2)=1.25
     
    圖1.3  雙核處理器上的並行化
    在情況下,假設並行處理器個數為無窮大,則有如圖1.4所示的處理過程。步驟2和步驟5的處理時間趨於0。即使這樣,繫統整體耗時依然大於300個時間單位,即加速比的極限為500/300=1.67。
    使用加速比計算公式,N趨於無窮大,有Speedup=1/F,且F=0.6,故有Speedup=1.67。
     
    圖1.4  情況下的並行化
    由此可見,為了提高繫統的速度,僅增加CPU處理器的數量並不一定能起到有效的作用。需要從根本上修改程序的串行行為,提高繫統內可並行化的模塊比重,在此基礎上合理增加並行處理器的數量,纔能以小的投入得到的加速比。
    ?注意:根據Amdahl定律,使用多核CPU對繫統進行優化,優化的效果取決於CPU的數量及繫統中串行化程序的比重。CPU數量越多,串行化比重越低,則優化效果越好。僅提高CPU數量而不降低程序的串行化比重,則無法提高繫統性能。
    1.2  性能調優的層次
    為了提升繫統性能,開發人員可以從繫統的各個角度和層次對繫統進行優化。除了常見的代碼優化外,在軟件架構、JVM虛擬機、數據庫及操作繫統幾個層面可以通過各種手段進行調優,從而在整體上提升繫統的性能。
    1.2.1  設計調優
    設計調優處於所有調優手段的上層,它往往需要在軟件開發之前進行。在軟件開發之初,軟件架構師就應該評估繫統可能存在的各種潛在問題,並給出合理的設計方案。由於軟件設計和架構對軟件整體質量有決定性的影響,所以,設計調優對繫統性能的影響也是的。如果說代碼優化、JVM優化都是對繫統在微觀層面上“量”的優化,那麼設計優化就是對繫統在宏觀層面上“質”的優化。
    設計優化的一大顯著特點是,它可以規避某一個組件的性能問題,而非改良該組件的實現。例如,繫統中組件A需要等待某事件E纔能觸發一個行為。如果組件A通過循環監控不斷監測事件E是否發生,其監測行為必然會占用部分繫統資源,因此,開發人員必須在監測頻率和資源消耗間取得平衡。如果監測頻率太低,雖然減少了資源消耗,但是繫統實時反應性就會降低。如果進行代碼層的調優,就需要優化監測方法的實現以及求得一個為恰當的監測頻率。
    而若將此問題預留在設計層解決,便可以使用事件通知的方式將繫統行為進行倒置。例如,使用將在第2章中提到的觀察者模式,在事件E發生的時刻,由事件E通知組件A,從而觸發組件A的行為。這種設計方法棄用了存在性能隱患的循環監控,從根本上解決了這一問題。
    從某種程度上說,設計優化直接決定了繫統的整體品質。如果在設計層考慮不周,留下太多問題隱患,那麼這些“質”上的問題,也許無法再通過代碼層的優化進行彌補。因此,開發人員必須在軟件設計之初,要認真、仔細地考慮軟件繫統的性能問題。
    進行設計優化時,設計人員必須熟悉常用的軟件設計方法、設計模式、基本性能組件和常用的優化思想,並將其有機地集成在軟件繫統中。
    ?注意:一個良好的繫統設計可以規避很多潛在的性能問題。因此,盡可能多花一些時間在繫統設計上,這是創建高性能程序的關鍵。
    1.2.2  代碼調優
    代碼調優是在軟件開發過程中或者在軟件開發完成後,軟件維護過程中進行的對程序代碼的改進和優化。代碼優化涉及諸多編碼技巧,需要開發人員熟悉相關語言的API,並在合適的場景中正確使用相關API或類庫。同時,對算法和數據結構的靈活使用,也是代碼優化的重要內容。
    雖然代碼優化是從微觀上對性能進行調整,但是一個“好”的實現和一個“壞”的實現對繫統的影響也是非常大的。例如,同樣作為List的實現,LinkedList和ArrayList在隨機訪問上的性能卻相差幾個數量級。又如,同樣是文件讀寫的實現,使用Stream方式與Java NIO方式,其性能可能又會相差一個數量級。
    因此,與設計優化相比,雖然筆者將代碼優化稱為在微觀層面上的優化,但它卻是對繫統性能產生直接影響的優化方法。
    1.2.3  JVM調優
    由於Java軟件總是運行在JVM虛擬機之上,因此對JVM虛擬機進行優化也能在一定程度上提升Java程序的性能。JVM調優通常可以在軟件開發後期進行,如在軟件開發完成或者在軟件開發的某一裡程碑階段進行。
    作為Java軟件的運行平臺,JVM的各項參數如JVM的堆大小和垃圾回收策略等,將會直接影響Java程序的性能。
    要進行JVM層面的調優,需要開發人員對JVM的運行原理和基本內存結構有一定了解,例如堆內存的結構、GC的種類等,然後依據應用程序的特點,設置合理的JVM啟動參數。
    1.2.4  數據庫調優
    對絕大部分應用繫統而言,數據庫是必不可少的一部分。Java程序可以使用JDBC的方式連接數據庫。對數據庫的調優可以分為以下3個部分:
    ? 在應用層對SQL語句進行優化;
    ? 對數據庫進行優化;
    ? 對數據庫軟件進行優化。
    在應用層優化數據庫訪問,涉及大量的編程技巧。例如,當使用JDBC進行查詢時,對於大量擁有相同結構的SQL查詢,可以使用PreparedStatement代替Statement,提高數據庫的查詢效率;在Select語句中,顯示指定要查詢的列名,避免使用星號“*”。
    在對數據庫進行優化時,主要目的是建立一個具有良好表結構的數據庫。例如,為了提高多表級聯查詢效率,可以合理地使用冗餘字段;對於大表,可以使用行的水平切割或者類似於Oracle分區表的技術;為了提高數據庫的查詢效率,可以建立有效且合理的索引。
    對於數據庫軟件的優化,根據不同的數據庫,如Oracle、MySQL或SQL Server,都擁有不同的方式。以Oracle為例,設置合理大小的共享池、緩存緩衝區或者PGA,對Oracle的運行性能都有很大的影響。
    鋻於本書的討論範圍,數據庫優化將不作為本書的闡述重點。
    1.2.5  操作繫統調優
    作為軟件運行的基礎平臺,操作繫統的性能對應用繫統也有較大的影響。不同類型的操作繫統,調優的手段和參數可能會有所不同。例如,在主流UNIX繫統中,共享內存段、信號量、共享內存值(shmmax)、共享內存小值(shmmin)等都是可以進行優化的繫統資源。此外,如文件句柄數、虛擬內存大小、磁盤的塊大小等參數都可能對軟件的性能產生影響。圖1.5展示了在Windows平臺上配置虛擬內存的界面。
    ?說明:操作繫統的性能調優不在本書的討論範圍內,有興趣的讀者可以參考相關書籍。
    1.3  基本調優策略和手段
    存在性能問題的繫統,十有八九是由某一繫統瓶頸導致的。隻要找到該性能瓶頸,分析瓶頸的形成原因,對癥下藥,使用合理的方法解決繫統瓶頸,就能從根本上提升性能。所以,繫統性能優化的主要目的就是查找並解決性能瓶頸問題。但值得注意的是,性能優化往往會涉及對原有的實現進行較大的修改,因此很難保證這些修改不引發新的問題。所以,在性能優化前,需要對性能優化的目標和使用的方法進行統籌安排。
    1.3.1  優化的一般步驟
    對軟件繫統進行優化,首先需要有明確的性能目標,清楚地指出優化的對像和終目的。其次,需要在目標平臺上對軟件進行測試,通過各種性能監控和統計工具,觀測和確認當前繫統是否已經達到相關目標,若已經達到,則沒有必要再進行優化;若尚未達到優化目標,則需要查找當前的性能瓶頸。
    可能成為性能瓶頸的因素很多,如磁盤I/O、網絡I/O和CPU。當找到性能瓶頸後,首先需要定位相關代碼,確認是否在軟件實現上存在問題或者具有優化的空間。若存在優化空間,則進行代碼優化;否則需要考慮進行JVM層、數據庫層或者操作繫統的優化,甚至可以考慮修改原有設計,或者提升硬件性能。
    當優化完成後,需要在目標平臺上進行確認測試。若達到性能目標,則優化過程結束;否則需要再次查找繫統瓶頸,如此反復,如圖1.6所示。
     
    圖1.6  性能優化的一般步驟
    1.3.2  繫統優化的注意事項
    性能優化雖然能提升軟件的性能,但是優化過程往往伴隨著一些風險和弊端。例如,為了優化某一段代碼的實現,就需要重寫原有的算法,而這就很可能引入新的Bug。重新實現新的功能模塊同時也意味著需要重新對其進行完整的功能性測試,使優化前所做的測試工作變得毫無意義。而且,優化後的代碼與優化前的代碼相比,可能會比較晦澀難懂,在一定程度上影響了繫統的可維護性。因此,軟件優化需要在軟件功能、正確性和可維護性之間取得平衡,而不應該過分地追求軟件性能。
    在進行優化前,必須要有明確的已知問題和性能目標,決不可為了“優化”而“優化”。因此在動手前,必須知道自己要干什麼。任何優化都是為了解決具體的軟件問題,如果軟件已經可以正常工作,在沒有性能問題暴露前,隻是憑著主觀臆斷對某些模塊進行性能改進,從軟件規範化開發的角度來說是非常冒險的。因為修改後的新代碼沒有經過完整的測試,軟件質量就沒有保障。而且,優化後的性能提升幅度可能並不足以讓開發者值得如此費盡心機。因此,在進行軟件優化時,必須要進行慎重的評估。
    ?注意:性能調優必須有明確的目標,不要為了調優而調優。如果當前程序並沒有明顯的性能問題,盲目地進行調優,其風險可能遠遠大於收益。
    1.4  小    結
    通過本章的學習,讀者應該了解性能的基本概念及常用的參考指標。此外,本章還較為詳細地介紹了與性能調優相關的兩個重要理論——木桶原理和Amdahl定律。
    根據木桶原理,繫統的終性能總是由繫統中性能差的組件決定的,因此,改善該組件的性能對提升繫統整體性能有重要的作用。而根據Amdahl定律可以知道,隻是增加處理器數量對提升繫統性能並沒有太大的實際意義,還必須同時提高程序的並行化比重。
    本章還簡要介紹了在軟件開發和維護過程中可以進行性能優化的各個階段。例如,在軟件的設計階段,需要選用合理的軟件結構和性能組件;在編碼階段,需要提高代碼的執行效率;對於Java應用程序,在繫統的運行期,還需要設置合理的JVM虛擬機參數;同時,優化數據庫和操作繫統也對繫統整體性能有直接影響。
    在本章的後還簡要介紹了性能優化的一般步驟和注意事項。


     







     
    網友評論  我們期待著您對此商品發表評論
     
    相關商品
    在線留言 商品價格為新臺幣
    關於我們 送貨時間 安全付款 會員登入 加入會員 我的帳戶 網站聯盟
    DVD 連續劇 Copyright © 2024, Digital 了得網 Co., Ltd.
    返回頂部