05.JVM调优实战
2020-12-23 18:29:26 0 举报
JVM调优
作者其他创作
大纲/内容
查看当前进程JVM设置信息
jstack 进程号
实例个数以及占用内存大小
jstat -gc 进程号
使用场景
# github下载arthaswget https://alibaba.github.io/arthas/arthas-boot.jar# 或者 Gitee 下载wget https://arthas.gitee.io/arthas-boot.jar
添加参数:---------主要必备参数-Xloggc:./gc-%t.log :打印文件名称-XX:+PrintGCDetails :打印GC信息-XX:+PrintGCDateStamps :打印GC日期-XX:+PrintGCTimeStamps :打印GC时间-XX:+PrintGCCause :打印引发GC原因---------选择性使用-XX:+UseGCLogFileRotation :循环覆盖使用使用GC的日志文件-XX:NumberOfGCLogFiles=10 :记录日志文件的数量-XX:GCLogFileSize=100M :日志文件的大小
可视化调优工具
Arthas
查看应用程序的堆信息及gc情况
命令
1.打印出的GC日志可使用在线工具【https://gceasy.io】进行分析2.也可以自行查看GCCause进行调优检测
jinfo -flags 进程号
JVM参数查询
jstack
阿里巴巴Arthas
概念
查看当前应用程序线程信息,查找死锁
查看文档:【https://alibaba.github.io/arthas/commands.html#arthas】1. java -jar 直接运行Arthas2. dashboard:查看整个进程的运行情况,线程、内存、GC、运行环境信息3. thread:查看线程详细情况4. thread 线程ID:查看线程堆栈5. thread -b:查看线程死锁6. jad 类全路径:反编译,方便查看线上代码是否是正确的版本7. ognl:查看线上系统变量的值,甚至可以修改变量的值
Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6+, 采用命令行交互模式,可以方便的定位和诊断线上程序运行问题。Arthas 官方文档十分详细,详见:https://alibaba.github.io/arthas
java -XX:+PrintFlagsInitial 表示打印出所有参数选项的默认值java -XX:+PrintFlagsFinal 表示打印出所有参数选项在运行程序时生效的值
jinfo
1.是否有一个全局视角来查看系统的运行状况?2.为什么 CPU 又升高了,到底是哪里占用了 CPU ?3.运行的多线程有死锁吗?有阻塞吗?4.程序运行耗时很长,是哪里耗时比较长呢?如何监测呢?5.这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?6.我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?7.遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?8.有什么办法可以监控到 JVM 的实时运行状态?
num:序号instances:实例数量bytes:占用空间大小class name:类名称,[C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[][]
JVM参数实例
jstat
JVM调优工具
JVM运行日志
Jvisualvm
参数示例:‐Xms3072M :堆初始化内存大小‐Xmx3072M :堆最大内存‐Xmn2048M :年轻代内存大小‐Xss1M :栈(线程)内存大小 -XX:MetaspaceSize=256M:方法区初始化内存大小【 ‐XX:PermSize=256M 】JDK1.7 -XX:MaxMetaspaceSize=256M:方法区最大内存大小【 ‐XX:MaxPermSize=256M 】JDK1.7‐XX:SurvivorRatio=82 :动态年龄判断原则,>=Survivor区内存的的82%,才放入老年代‐XX:MaxTenuringThreshold=5 :长期存活的对象将进入老年代,设置年龄为5时进入老年代‐XX:PretenureSizeThreshold=1M :设置大对象进入老年代的阈值‐XX:+UseParNewGC :年轻代使用ParNew垃圾收集器‐XX:+UseConcMarkSweepGC=3 :老年代使用CMS垃圾收集器‐XX:CMSInitiatingOccupancyFaction=92 :默认92,设置进行FullGC的老年代内存阈值‐XX:+UseCMSCompactAtFullCollection :设置FullGC后进行内存碎片整理‐XX:CMSFullGCsBeforeCompaction=0 :设置没词FullGC完后都进行内存碎片整理,即频率
远程连接jvisualvm1.启动普通的jar程序JMX端口配置:java -Dcom.sun.management.jmxremote.port=8899 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar foo.jar2.tomcat的JMX配置JAVA_OPTS=-Dcom.sun.management.jmxremote.port=8899 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=falsejvisualvm远程连接服务需要在远程服务器上配置host(连接ip 主机名),并且要关闭防火墙
S0C:第一个幸存区的大小S1C:第二个幸存区的大小S0U:第一个幸存区的使用大小S1U:第二个幸存区的使用大小EC:伊甸园区的大小EU:伊甸园区的使用大小OC:老年代大小OU:老年代使用大小MC:方法区大小(元空间)MU:方法区使用大小CCSC:压缩类空间大小CCSU:压缩类空间使用大小YGC:年轻代垃圾回收次数YGCT:年轻代垃圾回收消耗时间,单位sFGC:老年代垃圾回收次数FGCT:老年代垃圾回收消耗时间,单位sGCT:垃圾回收消耗总时间,单位s
jmap -dump 进程号
当内存溢出时即时导出dump文件:设置JVM参数:-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=./ (路径)
jmap -histo 进程号
jmap
JVM参数汇总查看命令
堆内存信息
使用方法
0 条评论
回复 删除
下一页