- 调优基本概念
- 常用JVM参数
- GC调优思路
- 通用GC参数
- 垃圾收集器CMS参数调优
- 垃圾收集器G1参数调优
- 运行时JIT编译器参数调优
1 调优基本概念
在调整性能时,JVM有三个组件:
- 堆大小调整
- 垃圾收集器调整
- JIT编译器
在调优java应用程序时,重点是以下两个主要目标之一
响应性:应用程序或系统对请求的数据进行相应的速度,对于专注于响应性的应用程序,长的暂停时间是不可接受的,重点是在段时间内做出回应。
吞吐性:侧重于在特定时间段内最大化应用程序的工作量,对于专注于吞吐量的应用程序,高暂停事件是可接受的,由于高吞吐量应用程序在较长时间内专注于基准测试,因此不需要考虑快速响应时间。
2 常用JVM参数
参数 | 说明 |
---|
-XX:+AlwaysPreTouch | jvm启动时分配内存,而不是使用时再进行分配 |
-XX:ErrorFile=filename | 崩溃日志 |
-XX:+TraceClassLoading | 跟踪类加载信息 |
-XX:+PrintClassHistogram | 按下Ctrl+Break后,打印类的信息 |
-Xmx -Xms | 最大堆和最小堆 |
-xx:permSize、-xx:metaspaceSize | 永久代/元数据空间 |
-XX:+HeapDumpOnOutOfMemoryError | OOM时导出堆文件 |
-XX:+HeapDumpPath | OOM时堆导出的路径 |
-XX:OnOutOfMemoryError | 在OOM时,执行一个脚本 |
-XX:+PrintFlagsFinal -version | 打印所有的-XX参数和默认值 |
3 GC调优思路
- 分析场景:例如,启动速度慢,偶尔出现响应慢于平均水平或者出现卡顿。
- 确定目标:内存占用、低延迟、低吞吐量。
- 收集日志:通过参数配置收集GC日志,通过JDK工具查看GC状态。
- 分析日志:使用工具辅助分析日志,查看GC次数,GC时间。
- 调整参数:切换垃圾收集器或者调整垃圾收集器参数。
4 通用GC参数
参数 | 说明 |
---|
-XX:ParallelGCThreads | 并行GC线程数量 |
-XX:ConcGCThreads | 并发GC线程数量 |
-XX:MaxGCPauseMills | 最大停顿时间,单位毫秒,GC尽力保证回收时间不超过设定值 |
-XX:GCTimeRatio | 垃圾收集时间占总时间的比 |
-XX:SurvivorRatio | 设置Eden区大小和Survivor区大小的比例 |
-XX:NewRatio | 新生代和老年代的比 |
-verbose:gc、-XX:+printGC | 打印GC的简要信息 |
-XX:+PrintGCDetails | 打印GC详细信息 |
-XX:+PrintGCTimeStamps | 打印GC发生的时间戳 |
-Xloggc:log/gc.log | 指定GC log的位置,以文件输出 |
-XX:+PrintHeapAtGC | 每次GC后,都打印堆信息 |
5 垃圾收集器CMS参数调优
- 响应时间优先
- Parallel GC无法满足应用程序延迟要求时再考虑使用CMS垃圾收集器
- 新版建议用G1垃圾收集器
参数 | 说明 |
---|
-XX:+UseConcMarkSweepGC | 新生代使用并行收集器,老年代使用CMS+串行收集器 |
-XX:+UseParNewGC | 在新生代使用并行收集器,CMS默认开启 |
-XX:CMSInitiatingOccupancyFraction | 设置触发GC的阈值,默认68% |
-XX:+UseCMSCompactAtFullCollection | Full GC后,进行一次整理 |
-XX:+CMSFullGCsBeforeCompaction | 设置进行几次Full GC后,进行一次碎片整理 |
-XX:+CMSClassUnloadingEnabled | 允许对类元数据进行回收 |
-XX:+UseCMSInitiatingOccupancyOnly | 表示只在到达阈值的时候,才进行CMS回收 |
-XX:+CMSIncrementalMode | 使用增量模式,比较适合单CPU |
6 垃圾收集器G1参数调优
- 兼顾吞吐量和响应时间
- 超过50%的Java堆被实时数据占用
- 建议大堆(大小约6GB或更大)
- 且GC延迟要求有限的应用(稳定且可预测的暂停时间低于0.5秒)
参数 | 说明 |
---|
-XX:G1HeapRegionSize=<N | 设置region大小 |
-XX:G1MixedGCLiveThreholdPercent | 老年代依靠Mixed GC |
-XX:G1OldCSetRegionThreholdPercent | |
-XX:+ClassUnloadingWithConcurrentMark | G1增加并默认开启,在并发标记阶段结束后,JVM即进行类型卸载 |
-XX:G1NewSizePercent | 新生代的最小比例 |
-XX:G1MaxNewSizePercent | 新生代的最大比例 |
-XX:G1MixedGCCountTarget | Mixed GC数量控制 |
7 运行时JIT编译器参数调优
JIT编译指的是字节码编译为本地代码(汇编)执行,只有热点代码才会编译成本地代码。解释器执行节约内存,反之可以使用编译执行来提升效率
参数 | 说明 |
---|
-XX:+AggressiveOpts | 允许jvm使用积极的性能优化功能 |
-XX:-TieredCompilation | 分层编译,jdk8默认开启,jdk7默认关闭 |
-Xmaxjitcodesize、-XX:ReservedCodeCacheSize | 指定JIT编译代码的最大代码高速缓存最大值 |
-Xmixed | 除了热方法之外,解释器执行所有字节码,热方法被编译成本地代码 |
-XX:InitialCodeCacheSize | 初始化编译后的汇编指令,缓存区大小,字节 |
-XX:+PrintCompilation | 打开编译日志 |
-XX:CICompilerCount | JIT编译所使用的线程数量 |
-XX:+DoEscapeAnalysis | 逃逸分析,默认打开,对代码的深度优化 |
-XX:-Inline | 方法内联,默认打开 |
参考文章
网易云课堂《Java高级开发工程师》
结语
本人所有博客仅用于学习记录,不做任何商业用途,如涉及侵权,还请联系删除,感谢阅读,欢迎留言,一起进步~