JVM-调优和基础命令篇
JVM监控与调优 调优目的:1)防止出现OOM 2)解决OOM 3)减少Full GC出现的频率
性能优化步骤 1.性能监控(发现问题):非侵入式 在生产、质量评价或开发环境下实时的带有预防或主动性的活动。 性能监控的点:GC频率,CPU Load过高,OOM,内存泄漏,死锁,程序响应时间过长
2.性能分析(排查问题):侵入式,影响应用吞吐量或响应,通常在质量评估、系统测试或者开发环境下进行,是性能监控之后的步骤。 分析方法: 1)打印GC日志,通过GCViewer或者GCeasy来分析日志信息 2)灵活运用命令行工具,jstack,jmap,jinfo等 3)dump出推文件,使用内存分析工具分析文件 4)使用阿里Arthas,或jconsole,JVisualVM来实时查看JVM状态 5)jstack查看堆栈信息
3.性能调优(解决问题) 为改善应用响应性或吞吐量而更改参数、源代码、属性配置的活动 1)适当增加内存,根据业务背景选择垃圾回收器 2)优化代码,控制内存使用 3)增加机器,分散节点压力 4)合理设置线程池线程数量 5)使用中间件提高程序效率,比如缓存、消息队列等。其它…
4.性能评价/测试指标 四个点:停顿时间、吞吐量、内存占用、并发数
停顿时间(响应时间):①提交请求和返回请求的响应之间使用的时间,一般比较关注平均响应时间。②在垃圾回收环节中:暂停时间是执行垃圾收集时,程序的工作线程被暂停的时间。-XX:MaxGCPauseMillis
吞吐量:①对单位时间内完成的工作量(请求)的量度。②在GC中运行用户代码的时间站总运行时间的比例,(总运行时间=程序的运行时间+内存回收的时间)
并发数:同一时刻,对服务器有实际交互的请求数
内存占用:java堆区所占得内存大小
JVM监控工具-命令行
【jps】:查看正在运行的Java进程
语法:jps [options] 主机名
options: -q:只显示本地虚拟机唯一id,不显示主类的名称等 -l:输出应用程序主类的全类名 或执行的是jar包则输出jar完整路径 -m:输出虚拟机进程启动时传递给主类的main()的参数 -v:列出虚拟机进程启动时的JVM参数。比如:-Xms -Xmx等
【jstat 】: 查看JVM统计信息, 显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据, 用于检测垃圾回收问题及内存泄漏问题
语法:jstat options(操作) 主机名 [interval(间隔时间)] [ count(查询次数)]
options: -class:显示ClassLoader的相关信息,类的装载、卸载数量、总空间、类装载所消耗的时间等。
Loaded Bytes Unloaded Bytes Time
7136 15249.2 9 10.5 3.28
Loaded是类装载 Bytes占用字节
-gc:显示与GC先关的堆信息。包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息。
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
0.0 3072.0 0.0 3072.0 52224.0 5120.0 993280.0 146406.0 51656.0 45949.6 6856.0 6189.1 39 1.311 0 0.000 1.311
c是总内存,u是已使用内存,ccsc是压缩类空间大小,ccsu已使用大小
-gccapacity:显示内容与-gc基本相同,但输出主要关注java堆各个区域使用到的最大、最小空间
-gcutil:显示内容与-gc基本相同,但输出主要关注已使用空间站总空间的百分比
-gccause:与 -gcutil功能一样,但是会额外输出导致最后一次或当前正在发生的GC产生的原因
【jinfo】:实时查看和修改JVM配置参数,查看虚拟机配置参数信息,也可以用于调整虚拟机的配置参数
并非所有参数都支持动态修改。参数只有被标记为manageable的flag可以被实时修改。其实这个修改能力是极其有限的。
options: no option:输出全部的参数和系统属性。 -flag name:输出对应名称的参数。 -flags:输出全部的参数 -sysprops:输出系统的参数
-flag [±] name:开启或者关闭对应名称的参数,只有被标记为manageable的参数才可以被动态修改。(java -XX:+PrintFlagsFinal -version | grep manageable) -flag name=value:设定对应名称的参数。
【jmap】:导出内存映像文件&内存使用情况 获取dump文件,还可以获取目标java进程的内存相关信息,包括java堆各区域的使用情况、堆中对象的统计信息、类加载信息等。
option: -dump:生成Java堆转储快照dump文件,会暂停应用,线上系统慎用 -dump:live只保存堆中的存活对象 -heap:输出整个堆空间的详细信息,包括GC的使用、堆配置信息,以及内存的使用信息等。 -histo:输出推空间中对象的统计信息,包括类、实力数量和合计容量。-histo:live只统计堆中的存活对象 -finalizerinfo:显示在F-Queue中等待Finalizer线程执行fianlize方法的对象。
dump:推转储快照文件,二进制文件,指一个Java进程在某个时间点的内存快照
导出内存映像文件: 1)手动方式: jmap -dump:format=b,file=<filename.hprof> <pid.>
jmap -dump:live,format=b,file=<filename.hprof> <pid.>
2)自动方式: -XX:+HeapDumpOnOutOfMemoryError:在程序发生OOM时,导出应用程序的当前堆快照。 -XX:HeapDumpPath=<filename.hprof>:可以指定堆快照的保存位置
【jhat】分析jmap生成的heap dump 文件
【jstack】:用于生成虚拟机指定进程当前时刻的线程快照,(线程快照就是当前虚拟机内指定进程的每一条线程正在执行的方法堆栈的集合。)
生成线程快照的作用:可用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。这些都是导致线程长时间停顿的常见原因。当线程出现停顿时,就可以用jstack显示各个线程调用的堆栈情况。
在Thread dump中,要留意下面几种状态:
死锁,Deadlock(重点关注) 等待资源,Waiting on condition(重点关注) 等待获取监视器,Waiting on monitor entry(重点关注) 阻塞,Blocked(重点关注) 执行中,Runnable 暂停,Suspended
语法: jstack 主机号 -F:当正常输出的情况不被响应时,强制输出线程堆栈 -l:除堆栈外,显示关于锁的附加信息 -m:如果调用到本地方法的话,可以显示C/C++的堆栈 -h:帮助操作
【jcmd】用来实现前面除了jstat之外所有命令的功能,例如:导出堆、内存使用、查看Java进程、导出线程信息、执行GC、JVM运行时间。
option: jcmd -l:列出所有的JVM进程 jcmd pid help:针对指定的进程,列出支持的所有命令 jcmd pid 具体命令:显示指定进程的指令命令的数据
【jstatd】远程主机信息收集
命令jstatd是一个RMI服务端程序,它的作用相当于代理服务器,建立本地计算机与远程监控工具的通信。jstatd服务器将本机的Java应用程序信息传递到远程计算机。
工具: JDK自带的工具: jconsole:JDK自带的可视化监控工具。查看Java应用程序的运行概况、监控堆信息、永久区(或元空间)使用情况、类加载情况等。JAVA_HOME\bin\jconsole.exe。 Visual VM:提供了一个可视界面,用于查看Java虚拟机上运行的基于Java技术的应用程序的详细信息。JAVA_HOME\bin\jvisualvm.exe JMC:Java Mission Control,内置Java Flight Recorder。能够以极低的性能开销收集Java虚拟机的性能数据
第三方工具 MAT:Memory Analyzer Tool是基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具,他可以帮助我们查找内存泄露和减少内存消耗。Eclipse的插件形式。 JProfiler:商业软件,需要付费。功能强大。 Arthas:阿尔萨斯,Alibaba开源的Java诊断工具。https://github.com/alibaba/arthas/releases Btrace:Java运行时追踪工具。可以在不停机的情况下,跟踪指定的方法调用、构造函数调用和系统内存等信息
Arthas、Visual VM可看
查看12道真题和解析

