JVM调优


目录
  • JVM 常用命令介绍
    • jps
    • jstat
    • jinfo
    • jmap
    • jhat
    • jstack
  • 常见的JVM调优参数
    • -Xmx
    • -Xms
    • -Xmn
    • -Xss
    • -XX:MetaspaceSize
    • -XX:+PrintGCDetails

JVM 常用命令介绍

JVM 中常用的调优、故障处理等工具。

jps

虚拟机进程工具,全称是 JVM Process Status Tool,它的功能和 Linux 中的 ps 类似,可以列出正在运行的虚拟机进程,并显示虚拟机执行主类 Main Class 所在的本地虚拟机唯一 ID,虽然功能比较单一,但是这个命令绝对是使用最高频的一个命令。

jstat

虚拟机统计信息工具,用于监视虚拟机各种运行状态的信息的命令行工具,它可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据。

jinfo

Java 配置信息工具,全称是 Configuration Info for Java,它的作用是可以实时调整虚拟机各项参数。

jmap

Java 内存映像工具,全称是 Memory Map For Java,它用于生成转储快照,用来排查内存占用情况

jhat

虚拟机堆转储快照分析工具,全称是 JVM Heap Analysis Tool,这个指令通常和 jmap 一起搭配使用,jhat 内置了一个 HTTP/Web 服务器,生成转储快照后可以在浏览器中查看。不过,一般还是 jmap 命令使用的频率比较高。

jstack

Java 堆栈跟踪工具,全称是 Stack Trace for Java ,顾名思义,这个命令用来追踪堆栈的使用情况,用于虚拟机当前时刻的线程快照,线程快照就是当前虚拟机内每一条正在执行的方法堆栈的集合。

常见的JVM调优参数

-Xmx

设置JVM最大可用内存为1800M。

-Xmx1800M

-Xms

设置JVM初始化内存为1000M。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-Xms1000M

-Xmn

设置年轻代大小为350M。整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

-Xmn350M

-Xss

设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

-Xss300K

-XX:MetaspaceSize

参数是指Metaspace扩容时触发FullGC的初始化阈值,也是最小的阈值。这里有几个要点需要明确:

  • 如果没有配置-XX:MetaspaceSize,那么触发FGC的阈值是21807104(约20.8M),可以通过jinfo -flag MetaspaceSize pid得到这个值;
  • 如果配置了-XX:MetaspaceSize,那么触发FGC的阈值就是配置的值;
  • Metaspace由于使用不断扩容到-XX:MetaspaceSize参数指定的量,就会发生FGC;且之后每次Metaspace扩容都可能会发生FGC(至于什么时候会,比较复杂,跟几个参数有关);
  • 如果Old区配置CMS垃圾回收,那么扩容引起的FGC也会使用CMS算法进行回收;
  • 如果MaxMetaspaceSize设置太小,可能会导致频繁FullGC,甚至OOM;
  • 具体设置多大,建议稳定运行一段时间后通过jstat -gc pid确认且这个值大一些,对于大部分项目256m即可
    tips: 任何一个JVM参数的默认值可以通过如下指令获取
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
java -XX:+PrintFlagsFinal -version |grep MetaspaceSize

-XX:+PrintGCDetails

打印 gc 详细信息

-XX:+PrintGCDetails