一、性能调优目的
1. 减少`minor gc`的频率,将转移到老年代的对象数量降低到最新
2. 减少`full gc`次数
3. 找到并提升性能瓶颈
二、软件调优大致过程
- 查看内存和GC日志
-verbose.gc:显示GC的操作内容。打开它,可以显示最忙和最空闲收集行为发生的时间、收集前后的内存大小、收集需要的时间等。
-XX:+PrintGC #输出GC日志
-XX:+PrintGCDetails #输出GC的详细日志
-XX:+PrintGCTimeStamps #输出GC时间戳(以基准时间的形式)
-XX:+PrintHeapAtGC #在进行GC的前后打印出堆的信息
-Xloggc:/path/gc.log #日志文件的输出路径
-XX:+PrintGCApplicationStoppedTime #打印由GC产生的停顿时间
- 调整新生代和老年代比例
# 新生代和老年代一般内存比例为 1:2
-Xms # 初始堆大小
-Xmx # 最大堆大小
-Xmn # 新生代大小
-XX:NewRatio=n # 新生代和老年代的比例,一般为2,新生代1:老年代2
-XX:PermSize=n # 非堆内存大小,一般为物理内存1/64
-XX:MaxPermSize=n # 非堆内存最大值,默认是物理内存的1/4
# 新生代中 Eden和Survivor区设置(Survivor还分为to Survivor和from Survivor)
-XX:SurvivorRatio=n:新生代中Eden区与两个Survivor区的比值
-XX:PretenureSizeThreshold:直接进入老年代中的对象大小
-XX:MaxTenuringThreshold:进入老年代的年龄
性能分析
- 性能达标条件
-
Minor GC
执行时间不超过50ms
-
Minor GC
执行频率在10s
一次以上
-
Full GC
执行时间不到1s
-
Full GC
执行频率在10
分钟一次以上
常用工具列表
- 内存监控和故障处理
-
jps
: JVM Process Status Tool
, 显示指定系统内所有的HotSpot虚拟机进程。
-
jstat
: JVM statistics Monitoring
, 是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
-
jmap
: JVM Memory Map
用于生成heap dump
文件。
-
jhat
: JVM Heap Analysis Tool
, 与jmap
搭配使用,用来分析jmap
生成的dump
,jhat
内置了一个微型的HTTP/HTML
服务器,生成dump
的分析结果后,可以在浏览器中查看。
jstack
: 用于生成java
虚拟机当前时刻的线程快照。
-
jinfo
: JVM Configuration info
实时查看和调整虚拟机运行参数。
-
javap
: 查看经javac
之后产生的JVM
字节码代码,自动解析.class
文件, 避免了去理解class
文件格式以及手动解析class
文件内容。
-
jcmd
: 几乎集合了jps
、jstat
、jinfo
、jmap
、jstack
所有功能,一个多功能工具, 可以用来导出堆, 查看Java
进程、导出线程信息、 执行GC
、查看性能相关数据等。
- jdk自带调优工具
-
jconsole
: Java Monitoring and Management Console
, 监控内存,线程和类
-
jvisualvm
: 全能工具,可以分析内存快照、线程快照;监控内存变化、GC变化等
- 第三方工具
-
MAT
: Memory Analyzer Tool
, Java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗, 基于Eclipse
-
GChisto
: 分析gc日志的工具
JPS
- 查看基于
HotSpot
的JVM
里,具有访问权限的java
进程的具体状态
jps [options] [hostid]
-q #禁止输出类名,JAR文件名和传递给main方法的参数,只产生一个本地JVM标识符列表。
-m #显示传递给主方法的参数。 嵌入式JVM的输出可能为空。输出JVM启动时传递给main()的参数。
-l #显示应用程序主类的完整程序包名称或应用程序JAR文件的完整路径名称。
-v #显示传递给JVM的参数。
-V #禁止输出类名,JAR文件名和传递给main方法的参数,只产生一个本地JVM标识符列表(.hotspotrc文件,或者是通过参数-XX:Flags=指定的文件)。
-Joption #将选项传递给JVM,其中选项是Java应用程序启动器参考页上描述的选项之一。 例如,-J -Xms48m将启动内存设置为48 MB。
Jstat
Jmap
- 用于生成
heap dump
文件,如果不使用这个命令,可以使用-XX:+HeapDumpOnOutOfMemoryError
参数来让虚拟机出现OOM
时自动生成dunp
文件