《Java性能優化權威指南》讀書筆記(二)

7. JVM性能調優入門


  • 基本原則
    • Minor GC回收原則,儘量多的收集垃圾
    • GC內存最大化原則,堆越大越好
    • GC調優3選2原則,吞吐量、延遲、內存佔用

關注吞吐量和延遲的Java應用程序,都應該將-Xms和-Xms設定爲同一個值,由於不管擴展仍是縮減新生代或者老年代的空間,都須要full gc,而full gc會下降程序的吞吐量並致使更長的延遲。一樣須要將-XX: PermSize和-XX:MaxPermSize設置爲同一個值。web

//打印GC日誌參數:
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-Xloggc:<filename>
---------------
-XX:PrintGCDateStamps
---------------
-XX:PrintGCApplicationStoppedTime
-XX:PrintGCApplicationConcurrentTime
-XX:PrintSafepointStatistics
---------------
//新生代:
-XX:NewSize=<n>,設定新生代初始值、最小值
-XX:MaxNewSize=<n>,設定新生代最大值
-Xms<n>,設定新生代初始值、最小值和最大值
---------------
//永久代:
-XX:PermSize=<n>
-XX:MaxPermSize=<n>
  • 計算活躍數據
    • 屢次Full GC數據,以後,取平均值計算
    • 命令行觸發full gc:jmap -histo:live <pid>
  • 通用配置
    • -Xms和-Xmx設置爲老年代活躍數據的3~4倍
    • -XX: PermSize和-XX:MaxPermSize設置爲永久代活躍數據的1.2~1.5倍
    • 新生代爲老年代活躍數據的1~1.5倍
  • 優化新生代
    • 新生代越小,minor gc時間越短,頻率越高
    • 老年代大小不小於活躍數據的1.5倍
    • 新生代至少爲堆的10%
    • 增長堆,可是要注意物理內存
  • 優化老年代
    • Java堆總大小-新生代=老年代大小
    • 老年代大小-老年代活躍數據=空閒空間
    • 每次Minor GC後,老年代佔用空間能夠計算提高率
    • 提高率/空閒空間=平均Full GC次數
  • CMS調優
    • 若是老年代用盡,觸發單線程的stop-the-world壓縮式垃圾蒐集
    • 若是minor gc TO不足以容納從Eden和From的對象,溢出到老年代,致使非計劃的老年代消耗加速
    • 單個survivor大小 = -Xmn / (-XX:Survivoration=<ratio> + 2)
  • 解析晉升閾值
    • -XX:PrintTenuringDistribution
    • survivor空間大小小於總的存活對象大小,致使survivor空間溢出
    • 對象年齡明顯小於晉升閾值,代表survivor空間太小
    • cms默認使用50%的目標survivor空間,對象總大小/50%=單個survivor大小
    • 這個50%是-XX:TargetSurvivoratio=<percent>配置的
    • gc日誌中出現,concurrent mode failure,應該更早觸發cms,設定老年代佔用多少開始cms,兩個命令同時使用
      • -XX:CMSInitiatingOccupancyFraction=<percent>
      • -XX:+UseCMSInitiatingOccupancyOnly
  • 顯示垃圾收集
    • -XX:+DisableExplicitGC,忽略System.gc()調用
      • Full GC(System)是由System.gc()調用引發的
  • 永久帶CMS
    • 關鍵詞:Full GC,CMS Perm
    • 開啓永久帶回收,默認是不開啓的:-XX:+CMSclassUnloadingEnable,-XX:+CMSPermgenSweepingEnable
    • 也能夠設置多少百分比啓動回收
  • 減小停頓時間
    • 初始標記階段通常不用管
    • 從新標記,能夠指定線程:-XX:ParallelGCThreads=<n>,默認值:8 + (Runtime.availableProcessors() - 8) * 5 / 8
  • CMS吞吐調優
    • 指導原則:CMS包括Minor GC帶來的開銷應該小於10%,若是開銷在3%或者更小,則調優提高有限
  • Throughtput吞吐調優
    • (忽略)
  • 其餘方法
    • 實驗性優化
    • 逃逸分析
    • 偏向鎖
    • 大頁面支持,增長TLB的命中率
      • Solaris:pagesize -a
      • Linux:-XX:+UseLargePages,須要配合操做系統的修改
      • Windows:...

後面幾章介紹基準測試,和具體某方面(如web、webService)的優化細節,直接忽略了。性能

  • Java應用的基準測試
  • 多層應用的基準測試
  • Web應用的性能調優
  • WebService的性能
  • Java持久化及Enterprise Java Bean的性能
相關文章
相關標籤/搜索