文章目录

  • Pre
  • jstat
    • 评估内存使用及GC压力的整体情况 jstat -gc PID
    • -gcutil 输出主要关注已使用空间占总空间的百分比
    • -gccause 额外输出导致上一次GC产生的原因
    • 堆内存统计
    • 新生代垃圾回收统计
    • 新生代内存统计
    • 老年代垃圾回收统计
    • 老年代内存统计
    • 元数据空间统计
  • 运行情况预估


Pre

如题, 一顿操作猛如虎,业务系统总算快发布了,可是JVM的参数还是当初随意设置的那么几个参数, 咋弄? 系统的流量预估(均值、峰值)导致一系列的评估: 每秒的对象生成大小,新生代 老年代的比例是否合理, 动态年龄判断机制、老年代担保机制会不会被频繁触发,full gc 的频率。。。。

留下一脸懵逼的你在风中瑟瑟发抖~

不要怕 ,今天我们就来看一下如何通过合理的预估来设置系统的JVM参数

JVM-10虚拟机性能监控与故障处理工具之【JDK的命令行】

名称 英文全称 作用
jps JVM Process Status Tool 显示指定系统内所有的HotSPot虚拟机进程
jstat JVM Statistics Monitoring Tool 用于手机HotSpot虚拟机个方面的运行数据
jinfo Configuration Info for Java 显示虚拟机配置信息
jmap Memory Map for Java 生成虚拟机的内存转储快照(headump文件)
jhat Java Heap Analysis Tool 虚拟机堆转储快照分析工具
jstack Stack Trace For Java java堆栈跟踪工具,,显示线程快照

jstat

[root@artisan ~]# java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
[root@artisan ~]# jstat -help
Usage: jstat -help|-optionsjstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]Definitions:<option>      An option reported by the -options option<vmid>        Virtual Machine Identifier. A vmid takes the following form:<lvmid>[@<hostname>[:<port>]]Where <lvmid> is the local vm identifier for the targetJava virtual machine, typically a process id; <hostname> isthe name of the host running the target Java virtual machine;and <port> is the port number for the rmiregistry on thetarget host. See the jvmstat documentation for a more completedescription of the Virtual Machine Identifier.<lines>       Number of samples between header lines.<interval>    Sampling interval. The following forms are allowed:<n>["ms"|"s"]Where <n> is an integer and the suffix specifies the units as milliseconds("ms") or seconds("s"). The default units are "ms".<count>       Number of samples to take before terminating.-J<flag>      Pass <flag> directly to the runtime system.
[root@artisan ~]# 

官方都说了 jstat -help|-options ,是吧 看看 options的选项吧

[root@artisan ~]# jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation
[root@artisan ~]# 

从中可以看出 , jstat (JVM Statistics Monitoring Tool)用于监视虚拟机各种运行状态信息的命令行工具。 它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾回收、JIT编译等运行数据 。

划重点, 垃圾回收 ,这里我们重点看GC垃圾回收 ,因为JVM调优的本质就是为了减少full GC 的发生。

通过不同方式的测试,观察GC的情况,可以很好的预测和分析 每秒的对象生成大小,新生代 老年代的比例是否合理, 动态年龄判断机制、老年代担保机制会不会被频繁触发,full gc 的频率。。。。

选项option代表用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集、运行期编译状况。

jstat的主要选项

选项 作用
-class 监视类装载、卸载数量,总空间以及类装载锁耗费的时间
-gc 监视Java堆状况,包括eden区、两个Survivor区、老年代、永久代等的容量、已使用空间、GC时间合计等信息
-gccapacity 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用的最大、最小空间
-gcutil 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因
-gcnew 监视新生代GC状况
-gcnewcapacity 监视内容与-gcnew 基本相同,但输出主要关注Java堆各个区域使用的最大、最小空间
-gcold 监视老年代代GC状况
-gcoldcapacity 监视内容与-gcold 基本相同,但输出主要关注Java堆各个区域使用的最大、最小空间
-gcpermcapacity 输出永久代使用的最大、最小空间
-compiler 输出JIT编译器编译过的方法、耗时等信息
-printcompilation 输出已经被JIT编译的方法

评估内存使用及GC压力的整体情况 jstat -gc PID

[root@artisan ~]# jps
5811 kooteam.jar
10478 Jps
[root@artisan ~]# jstat -gc 5811 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
34944.0 34944.0  0.0    0.0   279616.0 44044.5   699072.0   13979.2   21248.0 20630.5 2560.0 2386.8      0    0.000   1      0.338    0.338
[root@artisan ~]# 

参数解读

  • S0C:第一个幸存区的大小,单位KB
  • S1C:第二个幸存区的大小
  • S0U:第一个幸存区的使用大小
  • S1U:第二个幸存区的使用大小
  • EC:伊甸园区的大小
  • EU:伊甸园区的使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • MC:方法区大小(元空间)
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • YGC:年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间,单位s
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间,单位s
  • GCT:垃圾回收消耗总时间,单位s

当然了,看一次肯定不行啊,一般都是间隔多长时间输出一次,持续观察。

比如 间隔2秒,打印1万次

[root@artisan ~]# jstat -gc 5811  2000 10000S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
34944.0 34944.0  0.0    0.0   279616.0 56627.5   699072.0   13979.2   21248.0 20630.5 2560.0 2386.8      0    0.000   1      0.338    0.338
34944.0 34944.0  0.0    0.0   279616.0 56627.5   699072.0   13979.2   21248.0 20630.5 2560.0 2386.8      0    0.000   1      0.338    0.338

根据压测,结合这个GC各个分代的情况,加之对业务的理解,推断是否存在不合理的地方。


-gcutil 输出主要关注已使用空间占总空间的百分比

监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比

[root@artisan ~]# jstat -gcutil 5811S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   0.00   0.00  24.75   2.00  97.09  93.23      0    0.000     1    0.338    0.338
[root@artisan ~]# jstat -gcutil 5811 2000 10000

参数解读

  • S0:幸存1区当前使用比例
  • S1:幸存2区当前使用比例
  • E:伊甸园区使用比例
  • O:老年代使用比例
  • M:元数据区使用比例
  • CCS:压缩使用比例
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

-gccause 额外输出导致上一次GC产生的原因

与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因

[root@artisan ~]# jstat -gccause 5811S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC                 0.00   0.00  25.75   2.00  97.09  93.23      0    0.000     1    0.338    0.338 Metadata GC Threshold No GC
[root@artisan ~]# jstat -gccause 5811 2000 10000
  • LGCC : 上一次GC的原因

堆内存统计

[root@artisan ~]# jstat -gccapacity 5811NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC
349504.0 349504.0 349504.0 34944.0 34944.0 279616.0   699072.0   699072.0   699072.0   699072.0      0.0 1069056.0  21248.0      0.0 1048576.0   2560.0      0     1
[root@artisan ~]# jstat -gccapacity 5811 2000 10000  --> 2秒输出一次 输出1万次

参数解读

  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:当前新生代容量
  • S0C:第一个幸存区大小
  • S1C:第二个幸存区的大小
  • EC:伊甸园区的大小
  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:当前老年代大小
  • OC:当前老年代大小
  • MCMN:最小元数据容量
  • MCMX:最大元数据容量
  • MC:当前元数据空间大小
  • CCSMN:最小压缩类空间大小
  • CCSMX:最大压缩类空间大小
  • CCSC:当前压缩类空间大小
  • YGC:年轻代gc次数
  • FGC:老年代GC次数

新生代垃圾回收统计

[root@artisan ~]# jstat -gcnew 5811S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
34944.0 34944.0    0.0    0.0 15  15    0.0 279616.0  56627.5      0    0.000
[root@artisan ~]# jstat -gcnew 5811  2000 10000 --> 2秒输出一次 输出1万次

参数解读

  • S0C:第一个幸存区的大小
  • S1C:第二个幸存区的大小
  • S0U:第一个幸存区的使用大小
  • S1U:第二个幸存区的使用大小
  • TT:对象在新生代存活的次数
  • MTT:对象在新生代存活的最大次数
  • DSS:期望的幸存区大小
  • EC:伊甸园区的大小
  • EU:伊甸园区的使用大小
  • YGC:年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间

新生代内存统计

[root@artisan ~]# jstat -gcnewcapacity 5811 NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 349504.0   349504.0   349504.0  34944.0  34944.0  34944.0  34944.0   279616.0   279616.0     0     1
[root@artisan ~]# jstat -gcnewcapacity 5811 2000 10000 --> 2秒输出一次 输出1万次

参数解读

  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:当前新生代容量
  • S0CMX:最大幸存1区大小
  • S0C:当前幸存1区大小
  • S1CMX:最大幸存2区大小
  • S1C:当前幸存2区大小
  • ECMX:最大伊甸园区大小
  • EC:当前伊甸园区大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代回收次数

老年代垃圾回收统计

[root@artisan ~]# jstat -gcold 5811 MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT   21248.0  20630.5   2560.0   2386.8    699072.0     13979.2      0     1    0.338    0.338
[root@artisan ~]# jstat -gcold 5811  2000 10000  --> 2秒输出一次 输出1万次

参数解读

  • MC:方法区大小
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

老年代内存统计

[root@artisan ~]# jstat -gcoldcapacity 5811 OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT   699072.0    699072.0    699072.0    699072.0     0     1    0.338    0.338
[root@artisan ~]# jstat -gcoldcapacity 5811 2000 10000

参数解读

  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:当前老年代大小
  • OC:老年代大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

元数据空间统计

[root@artisan ~]# jstat -gcmetacapacity 5811 MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT   0.0  1069056.0    21248.0        0.0  1048576.0     2560.0     0     1    0.338    0.338
[root@artisan ~]# jstat -gcmetacapacity 5811  2000 10000

参数解读

  • MCMN:最小元数据容量
  • MCMX:最大元数据容量
  • MC:当前元数据空间大小
  • CCSMN:最小压缩类空间大小
  • CCSMX:最大压缩类空间大小
  • CCSC:当前压缩类空间大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

运行情况预估

jstat 会用了哈

主要是利用jstat -gc pid 算出系统的关键参数 ,结合我们之前梳理的理论知识(这个没有,那基本上是不太可行了) ,先设置一些初始值,然后根据压测情况合理调整。

主要观察一下几点

【年轻代对象增长的速率】

可以执行命令 jstat -gc pid 2000 100(每隔2秒执行1次命令,共执行100次),通过观察EU(eden区的使用)来估算每秒eden大概新增多少对象.

如果系统负载不高,可以把频率2秒调大一些观察整体情况。

要考虑: 系统高峰期和低谷期间的压力,肯定是不一样的,总和考虑。


【Young GC的触发频率和每次耗时】

知道年轻代对象增长速率我们就能推根据eden区的大小推算出Young GC大概多久触发一次,Young GC的平均耗时可以通过 YGCT/YGC 公式算出,根据结果我们大概就能知道系统大概多久会因为Young GC的执行而卡顿多久。


【每次Young GC后有多少对象存活和进入老年代】

这个因为之前已经大概知道Young GC的频率,假设是每5分钟一次,那么可以执行命令 jstat -gc pid 300000 10 ,观察每次结果eden,survivor和老年代使用的变化情况,在每次gc后eden区使用一般会大幅减少,survivor和老年代都有可能增长,这些增长的对象就是每次Young GC后存活的对象,同时还可以看出每次Young GC后进去老年代大概多少对象,从而可以推算出老年代对象增长速率。


【Full GC的触发频率和每次耗时】

知道了老年代对象的增长速率就可以推算出Full GC的触发频率了,Full GC的每次耗时可以用公式 FGCT/FGC 计算得出。

优化思路其实简单来说就是尽量让每次Young GC后的存活对象小于Survivor区域的50%,都留存在年轻代里。尽量别让对象进入老年代。尽量减少Full GC的频率,避免频繁Full GC对JVM性能的影响。

JVM - 要上线了,JVM参数还没正儿八经的估算过咋办?相关推荐

  1. vue组件父传子参数,参数还没赋值完成就被传递,传递了空参数

    1.父组件传给子组件 在子组件里定义一个props,即props:['msg'],msg可以是对象也可以是基本数据类型, 也可定义一个默认值,即 props:{msg: {type: String, ...

  2. JVM难学?那是因为你没认真看完这篇文章

    JVM难学?那是因为你没认真看完这篇文章 一:虚拟机内存图解 JAVA程序运行与虚拟机之上,运行时需要内存空间.虚拟机执行JAVA程序的过程中会把它管理的内存划分为不同的数据区域方便管理. 虚拟机管理 ...

  3. jvm的内存分布,参数配置 和 GC处理机制

    转载 url: http://blog.csdn.net/ning109314/article/details/10411495 url:http://www.cnblogs.com/sunada20 ...

  4. Java8 官方jvm 标准参考 -XX 配置参数详细信息

    原文地址 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html 概要 java [ 选项 ] 类名 [ args ] ...

  5. 深入详解JVM内存模型与JVM参数详细配置

    本系列会持续更新. JVM基本是BAT面试必考的内容,今天我们先从JVM内存模型开启详解整个JVM系列,希望看完整个系列后,可以轻松通过BAT关于JVM的考核. BAT必考JVM系列专题 1.JVM内 ...

  6. 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置

    JVM基本是BAT面试必考的内容,今天我们先从JVM内存模型开启详解整个JVM系列,希望看完整个系列后,可以轻松通过BAT关于JVM的考核. BAT必考JVM系列专题 1.JVM内存模型 2.JVM垃 ...

  7. 一行命令获取当前JVM所有可设置的参数以及当前默认值

    2019独角兽企业重金招聘Python工程师标准>>> 一行命令获取当前JVM所有可设置的参数以及当前默认值 博客分类: java jvm 一行命令获取当前JVM所有可设置的参数以及 ...

  8. JVM内存模型、相关参数设置与命令查看

    JVM内存模型.相关参数设置与命令查看 JVM内存模型,你看这一篇就够了 - 知乎 (zhihu.com) Java虚拟机-Java8内存模型JVM(整理版) - 牧梦者 - 博客园 (cnblogs ...

  9. 二、JVM内存模型及内存参数设置

    二.JVM内存模型 1.Java语言跨平台特性 java程序主要通过JVM来实现跨平台的,JVM编译器将Java源代码文件编译成字节码文件(一次编译,随处运行),然后不同的操作系统生成的机器码不同,但 ...

最新文章

  1. 30天敏捷生活(8): 生成你的20/80待做事项列表
  2. linux 重启udev服务,Linux 7.x 中 UDEV 生效的方法
  3. mysql数据库-mysql数据定义语言DDL (Data Definition Language)归类(六)
  4. mysql系统搭建互备DB(双主)记录
  5. 王思聪花了100万的组装的电脑,网速到底有多快?
  6. 判断 localStorage 在不同浏览器的最大支持内存
  7. android 动态表情实现,Android编程实现QQ表情的发送和接收完整实例(附源码)
  8. 【Python游戏】用Python实现一个2048小游戏 | 附带源码
  9. 进销存管理系统是什么?能给企业带来哪些好处?
  10. delphi dll 使用
  11. 【题解】UVA11584 Partitioning by Palindromes
  12. mybatis 一对一 ,一对多,多对多的实现
  13. 二层交换机 三层交换机 四层交换机的区别
  14. 那些年我们一起手写过的单例
  15. 【webshell管理工具之一】中国菜刀
  16. html页面转盘如何实现,html5制作转盘的详解及实例
  17. syntaxhighlighter修饰代码时,底部出现水平滚动条
  18. 最后一次正确配置计算机,最后一次正确配置,win10恢复最近一次配置
  19. Simditor 富文本编辑器的使用
  20. 自然语言处理--NLTK 库casual_tokenize对非规范文本(表情符号等)分词

热门文章

  1. Oralce的图形化界面----plsql developer涉及到的知识点总结
  2. 记录git命令:本地创建项目后如何上传到github上
  3. sql 精读(六)获取每个类别中最受欢迎的商品
  4. Python 求最大子集的递归实现
  5. 用ipython 写spark
  6. mysql bin日志备份_mysql之binlog日志备份还原
  7. 知识图谱( 知识图谱管理)
  8. Tableau实战系列浏览 Tableau 环境(二) -工作区域
  9. 深度学习核心技术精讲100篇(六)-keras 实战系列之知识蒸馏(Knowledge Distilling)
  10. hadoop学习-stream-Top K记录