我所理解的JVM(七):JVM调优


声明:本文转载自https://my.oschina.net/u/3466682/blog/1575660,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

之前所有关于JVM的知识,主要视为JVM调优做准备的。
对于虚拟机的调优步骤,一般分为3步:

  1. 根据一定参数启动虚拟机
  2. 配置好压力测试参数进行压力测试
  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回收

参考资料:

  1. 《深入理解Java虚拟机》
  2. JVM原理讲解和调优
  3. JVM调优总结
  4. 如何合理的规划一次jvm性能调优

本文发表于2017年11月19日 10:33
(c)注:本文转载自https://my.oschina.net/u/3466682/blog/1575660,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2140 讨论 0 喜欢 1

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1