常用调优工具介绍

JDK本身提供了非常丰富的性能监控工具,除了继承visualVM和JConsole外,还有jstat、jstack、jps、jmap、jhat工具,这些是常用的性能分析工具
JConsole:JDK自带工具,其功能简单,但是在系统有一定负荷的情况下使用,对垃圾回收算法有很详细的跟踪
JProfiler:商业软件,功能强大
VisualVM:JDK自带,功能强大,和JProfiler类似
MAT:MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具

VisualVM

VisualVM是java jdk自带的调优工具,也是我们平时用的最多的调优工具,几乎涉及了jvm调优的方方面面。启动后和JConsole一样可以选择本地和远程

打开VisualVM

visualvm在jdk安装目录bin目录下,双击jvisualvm.exe就可以打开,也可以通过cmd下执行jvisualvm打开。
image.png

监视页面

image.png
CPU:展示java程序运行时CPU的资源占用情况
堆:堆内存的综合资源占用情况,这里要说明下堆内存是又年轻代和老年代组成,其中年轻代分为“伊甸园”和“两个幸存区”三部分组成,所以这里看到的堆实际上就是老年代、伊甸园、两个幸存区的内存综合情况
PermGen:用来存放静态变量和java类的定义信息(就是我们所说的永久代和方法区,在jdk1.8后移除了永久代,改而替换为元空间Metaspace)
类:用于展示虚拟机加载了多少个类
线程:当前虚拟机线程启动情况
堆:生产当前程序内存快照hprof文件,对内存溢出分析比较有帮助

线程页面

用于展示虚拟机线程运行状态
image.png
线程(dump):所有线程快照(对分析线程死锁比较有帮助)
时间线:展示每个线程的实时运行状态(不同颜色代表不同状态)

Visual VM可以根据需要安装不同的插件,每个插件的关注点都不同,有的主要监控GC,有的主要监控内存,有的监控线程等

JConsole

JConsole是一个JMX(Java Management Extensions,既:java管理扩展)的jvm监控与管理工具。监控主要体现在:堆栈内存、线程、CPU占用率、类、VM概要这几个方面,而管理主要是对JMX、MBean(managed beans,被管理的beans,是一系列资源,包含对象、接口、设备等)

打开JConsole

在java安装目录的bin目录下双击jconsole.exe即可启动,也可以在cmd目录下运行jconsole命令启动。
image.png
启动JConsole后可以看到概览、内存、线程、类、VM、概要、MBean选项页面。
image.png

  1. 内存页面

内存页面可以看到jvm在程序运行期间的内存状况,可以看堆和非堆的内存使用情况

  1. 线程页面

线程页面可以看当前jvm启动了多少个线程,并能查看每个线程的状态及堆栈信息,还有一个功能就是能够自动检测死锁

  1. 类页面

该页面其实和线程页面有些类似,不过显示的是JVM加载类的信息

  1. VM概要页面

显示当前JVM各个方面的信息,如:链接名称、虚拟机、运行时间、当前对大小、最大堆大小、垃圾收集器等

  1. MBean管理

JVM 内存参数设置

  • Xms 堆的最小空间大小
  • -Xmx 堆的最大空间大小
  • -Xmn 堆内存区域中年轻代大小
  • -XX:NewSize 新生代最小空间大小
  • -XX:MaxNewSize 新生代最大空间大小
  • -XX:PermSize 永久代最小空间大小
  • -XX:MaxPermSize 永久代最大空间大小
  • -Xss 每个线程的栈大小
  • -XX:ParalleGCThreads=20 配置并行收集器的线程数,既:同时多少个线程一起进行垃圾回收,此值最好配置与处理器数目相等
  • -XX:+UseParallelGC 选择垃圾收集器为并行收集器。此配置仅对年轻代有效。既上述配置下,年轻代使用并发收集,老年代任使用串行收集

    JVM典型配置参考

    • java -Xmx:3350m-Xms:3350m-Xmn2g-Xss128k
    • -XX:ParallelGCThreads=20
    • -XX:+UseConcMarkSweepGC-XX:+UseParNewGC

-Xmx3350m:设置JVM最大可用内存3350m
-Xms3350m:设置JVM最小可用内存3350m,此值和-Xms相同,可以每次垃圾回收完JVM重新分配内存
-Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代大小+老年代大小+持久代大小。持久带一般固定为64m,所以增大年轻代后,将会减小老年代的大小。此值对系统性能影响较大,官方推荐配置为整个堆的3/8
-Xss128k:设置每个线程的栈大小,JDK5.0 以后每个线程堆栈大小为 1M,以前 每个线程堆栈大小为 256K。根据应用的线程所需内存大 小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统 对一个进程内的线程数还是有限制的,不能无限生成,经验值在 3000~5000左右