Java 意外完全GC(人体工程学)

Java 意外完全GC(人体工程学),java,garbage-collection,Java,Garbage Collection,我运行的应用程序由3个阶段组成:加载初始数据、使用POST http请求更新数据、使用GET请求提供服务。 设置完所有数据(初始加载+后期更新)后,我调用System.gc(),我看到了 [Full GC (System.gc()) 2051102K->1082623K(3298304K), 13.3521960 secs] 因此,我预计old gen需要大约1000M的内存,并使用这种设置运行我的应用程序(在4G RAM docker容器中): 因此,我预计,从3750M堆中,2550

我运行的应用程序由3个阶段组成:加载初始数据、使用POST http请求更新数据、使用GET请求提供服务。 设置完所有数据(初始加载+后期更新)后,我调用System.gc(),我看到了

[Full GC (System.gc()) 2051102K->1082623K(3298304K), 13.3521960 secs]
因此,我预计old gen需要大约1000M的内存,并使用这种设置运行我的应用程序(在4G RAM docker容器中):

因此,我预计,从3750M堆中,2550M将用于新空间,以满足GET请求,1200M将用于旧一代。 在我的申请工作中,我

[Full GC (Ergonomics) 2632447K->1086729K(3298304K), 2.3360398 secs]
所以对我来说,触发完全GC看起来很奇怪。我的理解是,因为GET请求不会添加任何长期存在的数据,所以当新一代已满时,它应该只是一个小GC。所以我不明白

1) 为什么它运行完全GC(人体工程学)-它想改变发电布局吗

2) 为什么它在3298304K中只有2632447K被占用时运行?

几点:

  • GET/POST与此无关,您为GET/POST实现的逻辑才是最重要的。。。e、 g.GET方法可能存在内存泄漏

  • 不断增长的内存不一定会减少GC(它不会以线性方式工作)

  • GC通常每活动GB冻结约1秒,因此,对于1GB,冻结13秒是值得检查的

  • 下一步应该进行分析,以便更好地理解问题


只需对其进行分析。您不需要在评论中粘贴日志,而应该更新您的问题。谢谢,我在这里添加了日志:(人体工程学GC是最后一行)。所以在System.gc()之后,我们有了{[PSYoungGen:1760K->0K(2086912K)][ParOldGen:1097657K->1080797K(1228800K)]1099417K->1080797K(3315712K),[Metaspace:18466K->18466K(1067008K)],在人类工效学gc[完整的gc(人类工效学)[PSYoungGen 157660K->0K(2086912K)][ParOldGen:1080797K->1080725K(1228800K->1080725K)][ParOldGen,[元空间:18568K->18568K(1067008K)],1.4782103秒].所以YoungGen和OldGen的大小没有改变,在这种情况下,人体工程学GC会做什么?@dbf不要尝试自己读取它,使用日志分析器,它们很多!您正在将新一代的最小和最大大小设置为相同的大小
-XX:MaxNewSize=2550m-XX:NewSize=2550m
。删除最大值,然后重试!alfasin,谢谢建议。我试着不用MaxNewSize跑步,但仍然有2017-09-03T23:13:51.282+0300:217.526:[完全GC(人体工程学)[PSYoungGen:1571840K->0K(2099712K)][ParOldGen:1081163K->1080718K(1228800K)]2653003K->1080718K(3328512K),[Metaspace:18569K->18569K->18569K(1067008K)],1.418698秒][次:用户=5.38系统=0.02,真实=1.42秒]1.4秒和13秒之间有很大差异。尝试将最小值增加到3GB
[Full GC (Ergonomics) 2632447K->1086729K(3298304K), 2.3360398 secs]