如何设置JVM内存参数的大小
思路
参考这个文章:https://blog.csdn.net/losetowin/article/details/78569001

先触发程序的FullGC,然后马上查看老年代的内存占用情况,据此设置JVM的内存参数。
实现
触发FullGC
1 | |
查看老年代内存大小
1 | |
查看永久代内存大小
注意:JDK1.8废弃了永久代(PermGen),改为用元空间(Metaspace)替代。一般元空间的大小是不用我们主动设置的。因此这一步操作略掉。
计算参数数值
定义老年代FullGC后的内存大小为变量OGMU(Old Generation Memory Userd)
OGMU = 33m
Xms = Xmx = OGMU * 4 = 132m
确定最终启动命令
-Xms和-Xmx一般都设置成一样大小:
1 | |
常用命令
查看堆区信息
jmap -heap
查看GC情况
命令格式:
jstat [Options] vmid [interval] [count]
参数说明:
Options,选项,我们一般使用 -gcutil 查看gc情况
vmid,VM的进程号,即当前运行的java进程号
interval,间隔时间,单位为毫秒
count,打印次数,如果缺省则打印无数次
结果字段说明:
| 字段 | 说明 |
|---|---|
| S0C | 年轻代中第一个survivor(幸存区)的容量 (字节) |
| S1C | 年轻代中第二个survivor(幸存区)的容量 (字节) |
| S0U | 年轻代中第一个survivor(幸存区)目前已使用空间 (字节) |
| S1U | 年轻代中第二个survivor(幸存区)目前已使用空间 (字节) |
| EC | 年轻代中Eden(伊甸园)的容量 (字节) |
| EU | 年轻代中Eden(伊甸园)目前已使用空间 (字节) |
| OC | Old代的容量 (字节) |
| OU | Old代目前已使用空间 (字节) |
| PC | Perm(持久代)的容量 (字节) |
| PU | Perm(持久代)目前已使用空间 (字节) |
YGC |
从应用程序启动到采样时年轻代中gc次数 |
YGCT |
从应用程序启动到采样时年轻代中gc所用时间(s) |
FGC |
从应用程序启动到采样时old代(全gc)gc次数 |
FGCT |
从应用程序启动到采样时old代(全gc)gc所用时间(s) |
MC |
元空间(Metaspace)容量(KB) |
MU |
已经使用的元空间(Metaspace)大小(KB) |
GCT |
从应用程序启动到采样时gc用的总时间(s) |
| NGCMN | 年轻代(young)中初始化(最小)的大小 (字节) |
| NGCMX | 年轻代(young)的最大容量 (字节) |
| NGC | 年轻代(young)中当前的容量 (字节) |
| OGCMN | old代中初始化(最小)的大小 (字节) |
| OGCMX | old代的最大容量 (字节) |
| OGC | old代当前新生成的容量 (字节) |
| PGCMN | perm代中初始化(最小)的大小 (字节) |
| PGCMX | perm代的最大容量 (字节) |
| PGC | perm代当前新生成的容量 (字节) |
| S0 | 年轻代中第一个survivor(幸存区)已使用的占当前容量百分比 |
| S1 | 年轻代中第二个survivor(幸存区)已使用的占当前容量百分比 |
| E | 年轻代中Eden(伊甸园)已使用的占当前容量百分比 |
| O | old代已使用的占当前容量百分比 |
| P | perm代已使用的占当前容量百分比 |
| S0CMX | 年轻代中第一个survivor(幸存区)的最大容量 (字节) |
| S1CMX | 年轻代中第二个survivor(幸存区)的最大容量 (字节) |
| ECMX | 年轻代中Eden(伊甸园)的最大容量 (字节) |
| DSS | 当前需要survivor(幸存区)的容量 (字节)(Eden区已满) |
| TT | 持有次数限制 |
| MTT | 最大持有次数限制 |
参考文章:https://blog.csdn.net/zlzlei/article/details/46471627
查看元空间大小
通过上一步的jstat -gc
触发FullGC
jmap -dump:live,format=b,file=heap.bin
jmap -histo:live
关于GC的一些知识
参考文章:https://blog.csdn.net/u012767369/article/details/54962613