一、JVM概述
1、为什么要调优
1、防止出现OOM 2、解决OOM问题 3、减少Full GC频率 4、提高系统稳定性
2、性能优化的步骤
1)性能监控
主要监控GC频率、CPU、OOM问题、内存泄露、死锁、程序响应时间等问题;
2)性能分析
1、使用http://gceasy.io来分析GC日志 2、灵活使用命令行工具:jps、jstack、jstat、jmap、jinfo等 3、导出dump文件,使用内存分析工具分析 4、使用Arthas、jconsole、JVisualVM等工具实事查看JVM状态
3)性能调优
1、增加内存 2、优化代码 3、增加机器,分散服务器压力 4、合理分配线程数量 5、使用中间件进行缓存
4、性能指标
1、响应时间 2、吞吐量 3、并发数 4、内存占用
二、JVM监控及诊断之命令
1、jps(Java Process Status)
1)用途:
1、查看正在运行的Java进程
2)基本语法
jps [options] [hostid]
options参数:
-q:仅仅显示本地虚拟机id
-l:输出应用程序全类名
-m:列出虚拟机进程启动时传递主类的main()的参数
-v:列出虚拟机进程启动时的JVM参数
2、jstat(JVM Statistics Monitoring Tool)
1)用途:
1、用于监视虚拟机各种运行状态信息的命令行工具,可以显示本地或者远程中的类装载、内存、垃圾收集、JIT等状态;
2)基本语法
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
option参数:
> 类装载相关的:
-class:显示ClassLoader的相关信息: 类的装载、卸载数量、总空间、类装载所消耗的时间等;
> 垃圾回收相关的:
-gc:显示与GC相关的堆信息,包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息
-gccapacity:显示内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间
-gcutil:显示内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。
-gccause:与-gcutil功能一-样,但是会额外输出导致最后一次或当前正在发生的GC产生的原因
-gcnew:显示新生代GC状况
-gcnewcapacity:显示内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间
-geold:显示老年代GC状况
-gcoldcapacity:显示内容与-gcold基本相同,输出主要关注使用到的最大、最小空间
-gcpermcapacity:显示永久代使用到的最大、最小空间
> JIT相关的:
-compiler:显示JIT编译器编译过的方法、耗时等信息
-printcompilation:输出已经被JIT编译的方法
interval参数:用于指定输出统计数据的周期,单位为毫秒。即:查询间隔
count参数:用于查询的总次数
-t:可以在输出信息前加上一个Timestamp列,显示程序的运行时间。单位:秒
-h:可以在周期性数据输出时,输出多少行数据后输出一个表头信息
3、jinfo(Configration Info for Java)
1)用途:
1、查看虚拟机配置参数信息,也可用于调整虛拟机的配置参数。
2)基本语法
jinfo [options] pid
查看配置信息:
jinfo sysprops <进程ID>
jinfo flags <进程ID>
jinfo flag <进程ID>
修改配置信息:
jinfo -flag [+|-]参数名称 <进程ID>
jinfo -flag 参数名称=参数值 <进程ID>
拓展:
java -XX:+PrintFlagsInitial
java -XX:+PrintFlagsFinal
java -参数名称 +PrintCommandLineFlags
4、jmap(Java Memory map)
1)用途:
1、导出dump文件,获取java进程的内存相关信息;
2)基本语法
jmap [option] <pid>
option参数:
-dump:生成Java堆快照文件
-heap:输出整个堆空间的详细信息,包括GC的使用.堆配置信息,以及内存的使用信息等
-histo:输出堆中对象的同级信息,包括类、实例数量和合计容量
-permstat:以ClassLoader为统计口径输出永久代的内存状态信息(仅linux/solaris平台有效)
-finalizerinfo:显示在F-Queue中等待Finalizer线程执行finalize方法的对象(仅linux/solaris平台有效)
-F:强制生成dump文件
> 导数内存映射文件:
手动方式:
jmap dump:format=b,file=<filename.hprof> <pid>
jmap dump:live,format=b,file=<filename.hprof> <pid>
自动方式:
-XX:HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=<filename.hprof>
5、jhat(JVM Heap Analysis Tool)
1)用途:
1、JDK自带堆分析工具
2)基本语法
jhat [option] [dumpfile]
option参数:
-stack false|true
-refs false|true
-port port-number
-exclude exclude-file
-baseline exclude-file
-debug int
6、jstack(Java Stack Trace)
1)用途:
1、打印jvm中线程快照
2)基本语法
jstack [option] <pid>
-F:当正常输出的请求不被响应时,强制输出线程堆栈
-l:除堆栈外,显示关于锁的信息
-m:如果调用本地方法的话,可以显示C/C++的堆栈
7、jcmd(Java Command)
1)用途:
1、多功能命令行,可以实现除了jstat之外的所有命令的功能
2)基本语法
jcmd -l
jcmd 进程号 help
jcmd 进程号 具体命令
8、jstatd(Java Statistics Monitoring Daemon)
1)用途:
1、远程主机信息收集,此命令是一个RMI Server应用程序,提供了对JVM的创建和结束监视,也为远程监视工具提供了一个可以attach的接口
2)基本语法
jstatd [options]
options参数:
-nr
-p port
-n rminame
-J
三、JVM常用GUI工具
1、JDK自带工具
1、jconsole:JDK自带的可视化监控工具,查看Java应用程序的运行概况、监控堆信息、永久区(或元空间)使用情况、类加载情况等; 2、Visual VM:Visual VM是一个工具,它提供了一个可视界面,用于查看Java虚拟机上运行的基于Java技术的应用程序的详细信息; 3、JMC:Java Mission Control,内置Java Flight Recorder,能够以极低的性能开销收集Java虚拟机的性能数据。
2、第三方工具
1、MAT 2、JProfiler
四、JVM常用参数
1、JVM参数类型
类型一:标准参数选项
1、以 - 开头
2、Hotspot VM有两种模式,分别是server和client
类型二:-X参数选项
1、以-X开头
2、JVM的JIT编译模式相关的选项:-Xint解释模式、-Xcomp编译模式、-Xmixed混合模式
3、-Xms -Xmx -Xss参数分别是-XX:InitialHeapSize、-XX:MaxHeapSize、-XX:ThreadStackSize的缩写
类型三:-XX参数选项
1、以-XX开头
2、Boolean类型:
-XX:+<option>
-XX:-<option>
3、非Boolean类型:
-XX:<option>=<number>
-XX:<option>=<string>
4、-XX:+PrintFlagsFinal
输出所有参数的名称和默认值
默认不包括Diagnostic和Experimental的参数
可以配合-XX:+UnlockDiagnosticVMOptions和-XX:UnlockExperimentalVMOptions使用
2、常用JVM参数选项
1、打印设置的-XX选项及值
-XX:+PrintCommandLineFlags
-XX:+PrintFlagsInitial
-XX:+PrintFlagsFinal
-XX:+PrintVMOptions
2、堆、栈、方法区等内存大小的设置
> 栈:
-Xss1024k
> 堆:
-Xms1024k
-Xmx1024k
-Xmn1024k
-XX:NewSize=1024m
-XX:MaxNewSize=1024m
-XX:SurvivorRatio=8
-XX:+UserAdaptiveSizePolicy
-XX:NewRatio=2
-XX:PretenureSizeThreadshold=1024
-XX:MaxTenuringThreshold=15
-XX:+PrintTenuringDistribution
-XX:TargetSurvivorRatio
> 方法区:
永久代:
-XX:PermSize=256m
-XX:MaxPermSize=256m
元空间:
-XX:MetaspaceSize
-XX:MaxMetaspaceSize
-XX:+UseCompressedOops
-XX:+UserCompressedClassPointers
-XX:CompressedClassSpaceSize
> 直接内存
-XX:MaxDirectMemorySize
3、OOM相关选项
-XX:+HeapDumpOnOutMemoryError
-XX:+HeapDumpBeforeFullGC
-XX:HeapDumpPath=<path>
-XX:OnOutOfMemoryError
4、垃圾收集器相关选项
5、GC日志相关选项
常用参数:
-verbose:gc
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+PrintHeapAtGC
-Xloggc<file>
其他参数:
-XX:TraceClassLoading
-XX:PrintGCApplicationStoppedTime
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintReferenceGC
-XX:PrintTenuringDistribution
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=1
-XX:GCLogFileSize=1M
6、其他参数
-XX:+DisableExplicitGC
-XX:ReservedCodeCacheSize=<size>[G|M|K]
-XX:+UseCodeCacheFlushing
-XX:+DoEscapeAnalysis
-XX:+UseBiasedLocking
-XX:+UseLargePages
-XX:+PrintTLAB
-XX:TLABSize
|