如何设置JVM内存参数的大小

思路

参考这个文章:https://blog.csdn.net/losetowin/article/details/78569001

图片

先触发程序的FullGC,然后马上查看老年代的内存占用情况,据此设置JVM的内存参数。

实现

触发FullGC

1
jmap -histo:live 16743

查看老年代内存大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
jmap -heap 16743
Attaching to process ID 16743, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.122-b04

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 1004535808 (958.0MB)
NewSize = 20971520 (20.0MB)
MaxNewSize = 334495744 (319.0MB)
OldSize = 41943040 (40.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
capacity = 311427072 (297.0MB)
used = 4636952 (4.422142028808594MB)
free = 306790120 (292.5778579711914MB)
1.4889367100365636% used
From Space:
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
To Space:
capacity = 11534336 (11.0MB)
used = 0 (0.0MB)
free = 11534336 (11.0MB)
0.0% used
PS Old Generation
capacity = 102236160 (97.5MB)
used = 35341432 (33.70421600341797MB) #这就是老年代的内存大小
free = 66894728 (63.79578399658203MB)
34.56842667017228% used

26774 interned Strings occupying 3197200 bytes.

查看永久代内存大小

注意:JDK1.8废弃了永久代(PermGen),改为用元空间(Metaspace)替代。一般元空间的大小是不用我们主动设置的。因此这一步操作略掉。

计算参数数值

定义老年代FullGC后的内存大小为变量OGMU(Old Generation Memory Userd)

OGMU = 33m

Xms = Xmx = OGMU * 4 = 132m

确定最终启动命令

-Xms和-Xmx一般都设置成一样大小:

1
java -Xms128m -Xmx128m -Dspring.profiles.active=testing -jar /var/www/infomine/target/infomine.jar

常用命令

查看堆区信息

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 即可查看,里面的MU即是已使用的元空间大小,单位是KB

触发FullGC

jmap -dump:live,format=b,file=heap.bin 将当前的存活对象dump到文件,此时会触发FullGC
jmap -histo:live  打印每个class的实例数目,内存占用,类全名信息.live子参数加上后,只统计活的对象数量. 此时会触发FullGC

关于GC的一些知识

参考文章:https://blog.csdn.net/u012767369/article/details/54962613