主机上的可用内存减少,并从堆转储中看到大量无法访问的对象

问题描述

我的Java服务在-xms and -Xmx设置为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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...