之前所有关于JVM的知识,主要视为JVM调优做准备的。
 对于虚拟机的调优步骤,一般分为3步:
  - 根据一定参数启动虚拟机
- 配置好压力测试参数进行压力测试
- 可视化工具或者命令行查看虚拟机运行状态和GC日志进行分析
以上3步循环执行,最终目的是确定好启动参数。
 考核虚拟机的指标:
  - 吞吐量:重要指标之一,是指不考虑垃圾收集引起的停顿时间或内存消耗,垃圾收集器能支撑应用达到的最高性能指标。
- 延迟:其度量标准是缩短由于垃圾啊收集引起的停顿时间或者完全消除因垃圾收集所引起的停顿,避免应用运行时发生抖动。
- 内存占用:垃圾收集器流畅运行所需要 的内存数量。
  一般虚拟机的所使用的内存是确定的,优化指标主要体现在需求上是要低延迟还是高吞吐量。
   压力测试的参数及接口主要看业务。
 Jdk在jdk/bin目录下自带了一些可视化工具:  如jvisualvm和jconsole。
 Jdk在运行时也可以使用命令行来查看当前虚拟机的运行状态:
  - jps:查看当前虚拟机的进程状况。参数-v可以查看JVM的启动参数。
- jstat:查看当前虚拟机的统计信息。非常重要。
- jinfo:查看当前虚拟机的配置信息。比如未显式指定的一些默认值和默认选项
- jmap:生成堆转储快照,dump文件。
- jhat:转储快照的分析工具。很少使用。
- jstack:生成当前虚拟机的线程快照。
- hsdis:JIT生成代码反汇编。
压测调优阶段推荐使用可视化工具。线上紧急排查定位问题时使用命令行查看。
 对于GC日志来说,都是一些固定的格式,能看懂就行。
 特别注意的是:启动JVM后的操作系统本身的剩余内存一定要足够,在调优期间,要适当查看系统剩余内存状态,不能过低。
 常见的GC方式:
  - Serial
- ParNew + CMS
- ParallelYoung + ParallelOld
- G1GC
JVM常见设置
 堆设置
 -Xms:初始堆大小
 -Xmx:最大堆大小
 -Xmn:年轻代内存大小 -XX:NewRatio:设置年轻代和年老代的比值。
 -XX:SurvivorRatio:年轻代中Eden区与两个Survivor区的比值。
 -XX:MaxPermSize:设置持久代大小,jdk1.7之前有效。1.8之后给为元空间 -XX:MaxMetaspaceSize:设置元空间大小 -XX:PretenureSizeThreshold:直接晋升到老年代的对象大小。大于这个参数的对象将直接在老年代分配 -XX:MaxTenuringThrehold:晋升到老年代的对象年龄。当超过这个参数值时就进入老年代 -XX:+UseAdaptiveSizePolicy:动态调整Java堆中各个区域的大小以及进入老年代的年龄
 收集器设置
 -XX:+UseSerialGC:在新生代和老年代使用串行收集器
 -XX:+UseParalledlOldGC:设置并行年老代收集器
 -XX:+UseParNewGC:在新生代使用并行收集器
 -XX:+UseParallelGC :新生代使用并行回收收集器
 -XX:+UseParallelOldGC:老年代使用并行回收收集器
 -XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
 垃圾回收统计信息
 -XX:+PrintGC
 -XX:+PrintGCDetails
 -XX:+PrintGCTimeStamps
 -Xloggc:filename
 并行收集器设置
 -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数
 -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
 -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
 并发收集器设置
 -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况
 -XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数 -XX:ParallelCMSThreads:设定CMS的线程数量
 -XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发
 -XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理
 -XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
 -XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
 -XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收
 -XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候,才进行CMS回收
 参考资料:
  - 《深入理解Java虚拟机》
- JVM原理讲解和调优
- JVM调优总结
- 如何合理的规划一次jvm性能调优