查看 默认参数 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。附加字母k或K表示千字节,m或M指示兆字节,g或G指示千兆字节。根据系统配置在运行时选择默认值。对于服务器部署,-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 设置年轻代(托儿所)的堆的初始大小(以字节为单位)。附加字母k或K表示千字节,m或M指示兆字节,g或G指示千兆字节。
堆的年轻代区域用于新对象。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:
-XX:InitialHeapSize = size 设置内存分配池的初始大小(以字节为单位)。该值必须为0或1024的倍数且大于1 MB。附加字母k或K表示千字节,m或M指示兆字节,g或G指示千兆字节。根据系统配置在运行时选择默认值。请参阅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 实时信息
说一下每列所代表的含义。
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: 测试并还没有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
堆设置 -Xms:初始堆大小 -Xmx:最大堆大小 -Xmn:新生代大小 -XX:NewRatio:设置新生代和老年代的比值。 如:为3,表示年轻代与老年代比值为1:3
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 打开 报告