博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Java性能优化权威指南》读书笔记(二)
阅读量:6821 次
发布时间:2019-06-26

本文共 2159 字,大约阅读时间需要 7 分钟。

hot3.png

7. JVM性能调优入门


  • 基本原则
    • Minor GC回收原则,尽可能多的收集垃圾
    • GC内存最大化原则,堆越大越好
    • GC调优3选2原则,吞吐量、延迟、内存占用

关注吞吐量和延迟的Java应用程序,都应该将-Xms和-Xms设定为同一个值,因为无论扩展还是缩减新生代或者老年代的空间,都需要full gc,而full gc会降低程序的吞吐量并导致更长的延迟。同样需要将-XX: PermSize和-XX:MaxPermSize设置为同一个值。

//打印GC日志参数:-XX:+PrintGCTimeStamps-XX:+PrintGCDetails-Xloggc:
----------------XX:PrintGCDateStamps----------------XX:PrintGCApplicationStoppedTime-XX:PrintGCApplicationConcurrentTime-XX:PrintSafepointStatistics---------------//新生代:-XX:NewSize=
,设定新生代初始值、最小值-XX:MaxNewSize=
,设定新生代最大值-Xms
,设定新生代初始值、最小值和最大值---------------//永久代:-XX:PermSize=
-XX:MaxPermSize=
  • 计算活跃数据
    • 多次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的性能

转载于:https://my.oschina.net/serverx/blog/704947

你可能感兴趣的文章
使用Log4j为项目配置日志输出应用详细总结及示例演示.
查看>>
Lua-5.3.2 安装 luasocket 的正确姿势
查看>>
freeswitch实战经验1:服务器向成员主动发起会议邀请
查看>>
python转换文本编码和windows换行符
查看>>
try-catch中导致全局变量无法变化的bug
查看>>
Js中数组的操作
查看>>
浏览器缓存 from memory cache与from disk cache详解
查看>>
php编译常用选项
查看>>
Docker Machine 简介
查看>>
Angular4错误提示的说明(一)
查看>>
CCNA+NP学习笔记—交换网络篇
查看>>
一张图说明Linux启动过程
查看>>
计算数据库中各个表的数据量和每行记录所占用空间的脚本-转载来自(博客园 桦仔)...
查看>>
解决本机不能访问虚拟机web服务器网站的问题
查看>>
Exchange常见问题大全
查看>>
安装Sublime Text 2插件的方法
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
Kubernetes NFS存储服务的误报
查看>>
meta设置
查看>>