首页 > 解决方案 > 减少主机上的可用内存并从堆转储中看到大量无法访问的对象

问题描述

-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 还没有开始。

我的问题是

  1. 我的 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
  1. 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

标签: javamemorygarbage-collectionjvmjvm-arguments

解决方案


推荐阅读