JVM性能调优

一、性能调优目的

1. 减少`minor gc`的频率,将转移到老年代的对象数量降低到最新
2. 减少`full gc`次数
3. 找到并提升性能瓶颈

二、软件调优大致过程

  1. 查看内存和GC日志
-verbose.gc:显示GC的操作内容。打开它,可以显示最忙和最空闲收集行为发生的时间、收集前后的内存大小、收集需要的时间等。
-XX:+PrintGC      #输出GC日志    
-XX:+PrintGCDetails    #输出GC的详细日志    
-XX:+PrintGCTimeStamps   #输出GC时间戳(以基准时间的形式)    
-XX:+PrintHeapAtGC    #在进行GC的前后打印出堆的信息    
-Xloggc:/path/gc.log    #日志文件的输出路径    
-XX:+PrintGCApplicationStoppedTime    #打印由GC产生的停顿时间
  1. 调整新生代和老年代比例
# 新生代和老年代一般内存比例为 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:进入老年代的年龄

性能分析

  1. 性能达标条件
  • Minor GC执行时间不超过50ms
  • Minor GC执行频率在10s一次以上
  • Full GC执行时间不到1s
  • Full GC执行频率在10分钟一次以上

常用工具列表

  1. 内存监控和故障处理
  • jps: JVM Process Status Tool, 显示指定系统内所有的HotSpot虚拟机进程。
  • jstat: JVM statistics Monitoring, 是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
  • jmap: JVM Memory Map用于生成heap dump文件。
  • jhat: JVM Heap Analysis Tool, 与jmap搭配使用,用来分析jmap生成的dumpjhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。
    jstack: 用于生成java虚拟机当前时刻的线程快照。
  • jinfo: JVM Configuration info实时查看和调整虚拟机运行参数。
  • javap: 查看经javac之后产生的JVM字节码代码,自动解析.class文件, 避免了去理解class文件格式以及手动解析class文件内容。
  • jcmd: 几乎集合了jpsjstatjinfojmapjstack所有功能,一个多功能工具, 可以用来导出堆, 查看Java进程、导出线程信息、 执行GC、查看性能相关数据等。
  1. jdk自带调优工具
  • jconsole: Java Monitoring and Management Console, 监控内存,线程和类
  • jvisualvm: 全能工具,可以分析内存快照、线程快照;监控内存变化、GC变化等
  1. 第三方工具
  • MAT: Memory Analyzer Tool, Java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗, 基于Eclipse
  • GChisto: 分析gc日志的工具

JPS

  • 查看基于HotSpotJVM里,具有访问权限的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文件

你可能感兴趣的:(JVM性能调优)