У меня есть служба весенней загрузки. и не устанавливайте -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.