Почему Full GC не может освободить часть памяти, но ForceGarbageCollection, запущенная JVMTI, может - PullRequest
1 голос
/ 04 ноября 2019

У меня есть служба весенней загрузки. и не устанавливайте -Xmx, поэтому при запуске через несколько дней память будет стоить слишком дорого.

, и я обнаружил, что Full gc не может освободить часть памяти ,, но если я вызову один форсированный gc, будет освобождено больше памяти.

Мой Env - это Java8, а -XX: + UseParallelGC

ниже приведена информация о Java-pid:

 -XX:-BytecodeVerificationLocal
 -XX:-BytecodeVerificationRemote 
 -XX:CICompilerCount=4 
 -XX:InitialHeapSize=268435456
 -XX:+ManagementServer 
 -XX:MaxHeapSize=4280287232 
 -XX:MaxNewSize=1426587648 
 -XX:MinHeapDeltaBytes=524288 
 -XX:NewSize=89128960 
 -XX:OldSize=179306496 
 -XX:+UseParallelGC

Ниже журнала gc показан один полный GC.

  • Используемый размер от 0,38 Г до 0,16 Г <- должно быть 0,08 ГБ, 80 М не свободно </li>
  • общий размер от 0,51 Гдо 0,79G
2019-11-04T13:50:28.210+0800: 166.279: [Full GC (Ergonomics) [PSYoungGen: 52708K->0K(296448K)] [ParOldGen: 195505K->151265K(497664K)] 248213K->151265K(794112K), [Metaspace: 70984K->70983K(1114112K)], 0.2154114 secs] [Times: user=1.75 sys=0.00, real=0.22 secs] 

Ниже журнала gc показан один Force GC.

  • Используемый размер от 0,25G до 0,08G <- это разумно </li>
  • общий размер от 0,79G до 0,85G
2019-11-04T13:51:13.691+0800: 211.761: [GC (JvmtiEnv ForceGarbageCollection) 
Desired survivor size 93847552 bytes, new threshold 5 (max 15)
[PSYoungGen: 96393K->44887K(338432K)] 247659K->196152K(836096K), 0.0668965 secs] [Times: user=0.05 sys=0.01, real=0.07 secs] 
2019-11-04T13:51:13.759+0800: 211.828: [Full GC (JvmtiEnv ForceGarbageCollection) [PSYoungGen: 44887K->0K(338432K)] [ParOldGen: 151265K->78647K(509952K)] 196152K->78647K(848384K), [Metaspace: 70983K->70983K(1114112K)], 0.1138409 secs] [Times: user=0.66 sys=0.00, real=0.11 secs] 

Так что в начале я подозреваю, что мой код имеетнекоторая утечка памяти, но если force gc может освободить память, я думаю, утечки памяти не существует.

Я просто хочу знать, почему полный gc не может освободить некоторую память, а force gc может.

РЕДАКТИРОВАТЬ: Теперь я узнал, что полный gc не очистит все неиспользуемые объекты. Поэтому, если не установлен максимальный предел памяти, будет выделено больше памяти. Когда неиспользуемых объектов слишком много, произойдет OutOfMemoryError.

...