查看 默认参数

1
2
3
4
5
6
7
8
9
10
11
12
C:\Users\shuzhuo>java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
intx CompilerThreadStackSize = 0 {pd product}
uintx ErgoHeapSizeLimit = 0 {product}
uintx HeapSizePerGCThread = 87241520 {product}
uintx InitialHeapSize := 268435456 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 4263510016 {product}
intx ThreadStackSize = 0 {pd product}
intx VMThreadStackSize = 0 {pd product}
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)

参数信息

可以看到

InitialHeapSize=256M

MaxHeapSize=4066M

-XX:MaxHeapSize = size

设置内存分配池的最大大小(以字节为单位)。该值必须是1024的倍数且大于2 MB。附加字母kK表示千字节,mM指示兆字节,gG指示千兆字节。根据系统配置在运行时选择默认值。对于服务器部署,-XX:InitialHeapSize-XX:MaxHeapSize经常设置为相同的值。请参阅Java SE HotSpot虚拟机垃圾收集调整指南中的“人体工程学”部分http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/index.html

以下示例显示如何使用各种单位将分配的内存的最大允许大小设置为80 MB:

1
2
3
-XX:MaxHeapSize = 83886080 
-XX:MaxHeapSize = 81920k
-XX:MaxHeapSize = 80m

在Oracle Solaris 7和Oracle Solaris 8 SPARC平台上,此值的上限约为4,000 MB减去间接费用金额。在Oracle Solaris 2.6和x86平台上,上限约为2,000 MB减去间接费用金额。在Linux平台上,上限约为2,000 MB减去间接费用金额。

-XX:MaxHeapSize选项相当于-Xmx

-XX:NewSize = size

设置年轻代(托儿所)的堆的初始大小(以字节为单位)。附加字母kK表示千字节,mM指示兆字节,gG指示千兆字节。

堆的年轻代区域用于新对象。GC在该区域比在其他区域更频繁地进行。如果年轻一代的规模太小,那么将会执行大量的小型GC。如果尺寸太大,则只会执行完整的GC,这可能需要很长时间才能完成。Oracle建议您将年轻代的大小保持在整个堆大小的一半到四分之一之间。

以下示例显示如何使用各种单位将年轻代的初始大小设置为256 MB:

1
2
3
-XX:NewSize = 256m 
-XX:NewSize = 262144k
-XX:NewSize = 268435456

-XX:NewSize选项相当于-Xmn

-XX:NewRatio = ratio

设置年轻和老一代尺寸之间的比率。默认情况下,此选项设置为2.以下示例显示如何将年轻/旧比率设置为1:

1
-XX:NewRatio = 1

-XX:InitialHeapSize = size

设置内存分配池的初始大小(以字节为单位)。该值必须为0或1024的倍数且大于1 MB。附加字母kK表示千字节,mM指示兆字节,gG指示千兆字节。根据系统配置在运行时选择默认值。请参阅Java SE HotSpot虚拟机垃圾收集调整指南中的“人体工程学”部分```http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/index.html`。

以下示例显示如何使用各种单位将分配的内存大小设置为6 MB:

1
2
3
-XX:InitialHeapSize = 6291456 
-XX:InitialHeapSize = 6144k
-XX:InitialHeapSize = 6m

如果将此选项设置为0,则初始大小将设置为为旧代和年轻代分配的大小的总和。可以使用-XX:NewSize选项设置年轻代的堆大小。

内存监控的方法

jmap -heap pid

查看java 堆(heap)使用情况

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
48
49
C:\Users\shuzhuo> jmap -heap 22628
Attaching to process ID 22628, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.201-b09

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

Heap Configuration: //堆内存初始化配置
MinHeapFreeRatio = 0 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
MaxHeapFreeRatio = 100 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
MaxHeapSize = 4263510016 (4066.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = 89128960 (85.0MB) //对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
MaxNewSize = 1420820480 (1355.0MB) //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
OldSize = 179306496 (171.0MB) //对应jvm启动参数-XX:OldSize=:设置JVM堆的‘老生代’的大小
NewRatio = 2 //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)

Heap Usage: //堆内存分步
PS Young Generation
Eden Space: //Eden区内存分布
capacity = 532676608 (508.0MB) //Eden区总容量
used = 396765384 (378.3849563598633MB) //Eden区已使用
free = 135911224 (129.61504364013672MB) //Eden区剩余容量
74.48522762989435% used
From Space: //其中一个Survivor区的内存分布
capacity = 330301440 (315.0MB)
used = 46820536 (44.65154266357422MB)
free = 283480904 (270.3484573364258MB)
14.17509290907118% used
To Space: //另一个Survivor区的内存分布
capacity = 353894400 (337.5MB)
used = 0 (0.0MB)
free = 353894400 (337.5MB)
0.0% used
PS Old Generation //当前的Old区内存分布
capacity = 2842689536 (2711.0MB)
used = 1996192016 (1903.717056274414MB)
free = 846497520 (807.2829437255859MB)
70.2219496965848% used

63172 interned Strings occupying 7134664 bytes.

C:\Users\shuzhuo>

监控当前GC实时信息

jstat -gcutil pid time(ms) 命令监控当前 GC 实时信息

image-20211108112107243

说一下每列所代表的含义。

  • S0:年轻代中第一个 survivor(幸存区)使用比例
  • S1:年轻代中第二个 survivor(幸存区)使用比例
  • E:年轻代中 Eden(伊甸园区)使用比例
  • O:老年代使用比例
  • M:元数据区使用比例
  • CCS:压缩使用比例(不太了解是干什么的)\color{red}{CCS:压缩使用比例(不太了解是干什么的)}CCS:压缩使用比例(不太了解是干什么的)
  • YGC:从应用程序启动到采样时 Young GC 次数
  • YGCT:从应用程序启动到采样时 Young GC 所用时间(s)
  • FGC:从应用程序启动到采样时 Full GC 次数
  • FGCT:从应用程序启动到采样时 Full GC 所用时间(s)
  • GCT:从应用程序启动到采样时 GC 用的总时间(s)

先不值该大一点,设置为8G

1
-Xms4g -Xmx8g

调优参数1: 测试并还没有OOM

1
-XX:+HeapDumpOnOutOfMemoryError  -Xms4g -Xmx8g -XX:NewSize=4g -XX:ParallelGCThreads=2 -XX:NewRatio=2
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
48
49
C:\Users\shuzhuo>jmap -heap 31880
Attaching to process ID 31880, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.201-b09

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

Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 8589934592 (8192.0MB)
NewSize = 4294443008 (4095.5MB)
MaxNewSize = 4294967296 (4096.0MB)
OldSize = 524288 (0.5MB)
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 = 3884449792 (3704.5MB)
used = 1245030824 (1187.3539199829102MB)
free = 2639418968 (2517.14608001709MB)
32.05166473162127% used
From Space:
capacity = 207618048 (198.0MB)
used = 122576784 (116.89833068847656MB)
free = 85041264 (81.10166931152344MB)
59.03956095377604% used
To Space:
capacity = 202375168 (193.0MB)
used = 0 (0.0MB)
free = 202375168 (193.0MB)
0.0% used
PS Old Generation
capacity = 13107200 (12.5MB)
used = 7642208 (7.288177490234375MB)
free = 5464992 (5.211822509765625MB)
58.305419921875% used

53416 interned Strings occupying 5513096 bytes.

C:\Users\shuzhuo>

调优参数1: 测试

1
-XX:+HeapDumpOnOutOfMemoryError  -Xms4g -Xmx4g -XX:NewSize=4g -XX:ParallelGCThreads=4 -XX:NewRatio=2
1
-XX:+HeapDumpOnOutOfMemoryError  -Xms4g -Xmx4g -XX:NewSize=4g -XX:ParallelGCThreads=4
  1. 堆设置
    -Xms:初始堆大小
    -Xmx:最大堆大小
    -Xmn:新生代大小
    -XX:NewRatio:设置新生代和老年代的比值。
    如:为3,表示年轻代与老年代比值为1:3

-XX:SurvivorRatio:新生代中Eden区与两个Survivor区的比值。注意Survivor区有两个。
如:为3,表示Eden:Survivor=3:2,一个Survivor区占整个新生代的1/5
-XX:MaxTenuringThreshold:设置转入老年代的存活次数。如果是0,则直接跳过新生代进入老年代
-XX:PermSize、-XX:MaxPermSize:分别设置永久代最小大小与最大大小(Java8以前)
-XX:MetaspaceSize、-XX:MaxMetaspaceSize:分别设置元空间最小大小与最大大小(Java8以后)

JVM优化之 -Xss -Xms -Xmx -Xmn 参数设置

导出报告

1
2
3
4
5
6
C:\Users\shuzhuo>jps
18688
22628 MarvelClientV3Application
21736 RemoteMavenServer
30760 Launcher
31144 Jps

jmap -dump:format=b,file=20211108001.hprod [pid]

MAT 打开 报告

image-20211108105815304

image-20211108113307256