java - 减少主机上的可用内存并从堆转储中看到大量无法访问的对象
问题描述
-Xms and -Xmx
我的 java 服务在设置为 8GB的 16 GB RAM 主机上运行。主机正在运行其他一些进程。
我注意到我的服务随着时间的推移会消耗更多的内存。ps aux | awk '{print $6/1024 " MB\t\t" $11}' | sort -n
我在主机上运行了这个命令并记录了我的 java 服务的内存使用情况。服务启动时,它使用了大约 8GB 内存(-Xms and -Xmx
设置为 8GB),但一周后,它使用了大约 9GB+ 内存。它每天消耗大约 100MB 更多的内存。
我比较了堆转储,没有发现任何内存泄漏。重新启动我的 java 服务之前/之后的堆内存使用情况没有太大差异。但是,我注意到大量无法访问的对象。我比较了两个堆转储,发现由于无法访问的对象,保留堆大小增加了大约 500MB。
所以我的猜测是年轻空间中的一些对象没有被 GC 或移动到旧空间,也没有被 GC,因为完整的 GC 还没有开始。
我的问题是
- 我的 JVM 配置是否正确?我是否需要进行更改以避免大量无法访问的对象。
-Xms8G -Xmx8G
-XX:+UseG1GC
-XX:+DisableExplicitGC
-XX:MaxGCPauseMillis=75
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=1024m
-XX:ReservedCodeCacheSize=256m
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintTenuringDistribution
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintSafepointStatistics
-XX:+CITime
-XX:+PrintPromotionFailure
-XX:+PrintGCCause
-XX:+PrintJNIGCStalls
-XX:+PrintHeapAtGC
-XX:GCLogFileSize=100M
-XX:NumberOfGCLogFiles=2
- 从
jmap -heap
下面显示,我看到MaxNewSize
设置为 4GB,而NewSize
设置为 1MB。它会导致 GC 中出现任何问题,导致大量无法访问的对象吗?一些设置是盲目设置的(来自一些默认值)。
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 8589934592 (8192.0MB)*
NewSize = 1363144 (1.2999954223632812MB)
MaxNewSize = 5150605312 (4912.0MB)
OldSize = 5452592 (5.1999969482421875MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 134217728 (128.0MB)
CompressedClassSpaceSize = 1065353216 (1016.0MB)
MaxMetaspaceSize = 1073741824 (1024.0MB)
G1HeapRegionSize = 4194304 (4.0MB)
Heap Usage:
G1 Heap:
regions = 2048
capacity = 8589934592 (8192.0MB)
used = 2241515408 (2137.6756744384766MB)
free = 6348419184 (6054.324325561523MB)
26.09467376023531% used
G1 Young Generation:
Eden Space:
regions = 26
capacity = 4655677440 (4440.0MB)
used = 109051904 (104.0MB)
free = 4546625536 (4336.0MB)
2.3423423423423424% used
Survivor Space:
regions = 35
capacity = 146800640 (140.0MB)
used = 146800640 (140.0MB)
free = 0 (0.0MB)
100.0% used
G1 Old Generation:
regions = 480
capacity = 3787456512 (3612.0MB)
used = 1981468560 (1889.6756744384766MB)
free = 1805987952 (1722.3243255615234MB)
52.31660228234985% used