为什么Full GC无法释放一些内存,但是JVMTI触发的ForceGarbageCollection可以

我有一个Spring Boot服务。并没有设置-Xmx,所以几天后运行时,内存将花费太多。

我发现Full gc无法释放某些内存,但是如果我触发一个强制gc,则会释放更多的内存。

我的环境是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.38G减小到0.16G
  • 总大小从0.51G到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
  • 总大小从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] 

因此,一开始,我怀疑我的代码有一些内存泄漏,但是如果用力gc可以释放内存,我认为内存泄漏就不存在了。

我只想知道为什么完整的gc不能释放一些内存,而强制gc可以。

编辑: 现在,我了解到完整的gc不会清除所有未使用的对象。 因此,如果未设置最大内存限制,则会提交更多内存。 如果未使用的对象过多,则会发生OutOfMemoryError。

money000000 回答:为什么Full GC无法释放一些内存,但是JVMTI触发的ForceGarbageCollection可以

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3168713.html

大家都在问