JVM参数之堆栈空间配置

参数

含义

-Xms

初始堆大小

-Xmx

最大堆空间

-Xmn

设置新生代大小

-XX:SurvivorRatio

设置新生代eden空间和from/to空间的比例关系

-XX:PermSize

方法区初始大小

-XX:MaxPermSize

方法区最大大小

-XX:MetaspaceSize

元空间GC阈值(JDK1.8)

-XX:MaxMetaspaceSize

最大元空间大小(JDK1.8)

-Xss

栈大小

-XX:MaxDirectMemorySize

直接内存大小,默认为最大堆空间

一、堆配置

-Xms 设置堆的初始空间大小,使用 -Xmx 设置堆的最大空间大小

java -Xms20m -Xmx30m

JVM 提供了参数 -Xmn 来设置年轻代内存的大小,但没有提供参数设置老年代的大小。但其实老年代的大小就等于堆大小减去年轻代大小。

java -Xms20m -Xmn10M

-XX:+PrintGCDetails:查看内存区域的分配信息

-XX:SurvivorRatio = eden/from = eden/to:设置 eden / from 空间的比例关系

java -Xms20m -Xmn10M -XX:SurvivorRatio=2 -XX:+PrintGCDetails

PSYoungGen 的 total 指的是可用内存,from space 和 to space 两个区域,同一时间只有一个区域是可以用的。

在 JDK 1.8 之前,所加载的类信息都放在永久代中。我们用 -XX:PermSize 设置永久代初始大小,用 -XX:MaxPermSize 设置永久代最大大小。但在 JDK1.8 之时,永久代被移除,取而代之的是元空间(Metaspace)。在元空间这块内存中,有两个参数很相似,它们是: -XX:MetaspaceSize-XX:MaxMetaspaceSize。MetaspaceSize 设置的是元空间发生 GC 的初始阈值。当达到这个值时,元空间发生 GC 操作,这个值默认是 20.8M。而 MaxMetaspaceSize 则是设置元空间的最大大小,默认基本是机器的物理内存大小。虽然可以不设置,但还是建议设置一下,因为如果一直不断膨胀,那么 JVM 进程可能会被 OS kill 掉。

二、栈空间

-Xss 设置栈空间大小

java -Xss2m

三、直接内存

 -XX:MaxDirectMemorySiz :设置大小,默认对内存最大内存。

 

JVM参数之查看JVM参数

  1. -XX:+PrintVMOptions :程序运行时,打印虚拟机接受到的命令行显式参数。
  2. -XX:+PrintCommandLineFlags: 打印传递给虚拟机的显式和隐式参数。
  3. -XX:+PrintFlagsFinal: 打印所有的系统参数的值

JVM参数之追踪类信息

参数

含义

-verbose:class

跟踪类的加载和卸载

-XX:+TraceClassLoading

跟踪类的加载

-XX:+TraceClassUnloading

跟踪类的卸载

-XX:+PrintClassHistogram

显示类信息柱状图

 

JVM参数之GC日志

参数

含义

-XX:PrintGC

打印GC日志

-XX:+PrintGCDetails

打印详细的GC日志。还会在退出前打印堆的详细信息。

-XX:+PrintHeapAtGC

每次GC前后打印堆信息。

-XX:+PrintGCTimeStamps

打印GC发生的时间。

-XX:+PrintGCApplicationConcurrentTime

打印应用程序的执行时间

-XX:+PrintGCApplicationStoppedTime

打印应用由于GC而产生的停顿时间

-XX:+PrintReferenceGC

跟踪软引用、弱引用、虚引用和Finallize队列。

-XLoggc

将GC日志以文件形式输出。

 

JDK性能监控命令

查看虚拟机进程:jps 命令

参数

含义

-q

指定jps只输出进程ID

-m

输出传递给Java进程的参数

-l

输出主函数的完整路径

-v

显示传递给Java虚拟机的参数

 

虚拟机统计信息:jstat 命令

jstat -<option> [-t] [-h<lines>] <vmid> [<interval>] [<count>]]

 

参数

含义

-class

监视类装载、卸载数量、总空间以及类装载所耗费的时间

-gc

监视Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息

-gccapacity

监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间

-gcutil

监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比

-gccause

与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因

-gcnew

监视新生代GC状况

-gcnewcapacity

监视内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间

-gcold

监视老年代GC状况

-gcoldcapacity

监视内容与-gcold基本相同,输出主要关注使用到的最大、最小空间

-gcpermcapacity

输出永久代使用到的最大、最小空间

-compiler

输出JIT编译器编译过的方法、耗时信息

-printcompilation

输出已经被JIT编译的方法

-t 参数表示输出时间戳、-h 参数表示在多少行后输出一个表头、vmid 则是虚拟机的进程ID、interval 和 count 表示输出间隔以及输出次数。

例如:我们用jstat命令来监视一个LVMID为2365的JVM进程。

$ jstat -gcutil 2365 
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00  12.05   0.00  14.17      0    0.000     0    0.000    0.000

其中每个选项的意义如下:

参数

含义

S0、S1

表示Survivor0、Survivor1,还未使用。

E

表示Eden区使用了12.05%的空间。

O

表示老年代还未使用。

P

表示永久代使用了14.17%的空间

YUC、YGCT

表示从程序运行以来一共发生了0次Minor GC(YGC,Young GC),总共耗时0秒。

FGC、FGCT

表示从程序运行以来一共发生了0次Full GC(FGC,Full GC),总共耗时0秒。

查看虚拟机参数:jinfo 命令

jinfo <option> <pid>

导出堆到文件:jmap 命令

jmap [option] vmid

堆分析工具:jhat 命令

查看线程堆栈:jstack 命令

远程主机信息收集:jstatd 命令

多功能命令行:jcmd 命令

性能统计工具:hprof