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参数
- -XX:+PrintVMOptions :程序运行时,打印虚拟机接受到的命令行显式参数。
- -XX:+PrintCommandLineFlags: 打印传递给虚拟机的显式和隐式参数。
- -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