我正在运行包含3个阶段的应用程序:加载初始数据,使用POST http请求更新它,使用GET请求提供服务。 设置完所有数据后(初始加载+ POST更新)我正在调用System.gc()并看到
[Full GC (System.gc()) 2051102K->1082623K(3298304K), 13.3521960 secs]
所以我希望我需要大约1000M的旧版本并使用这样的设置运行我的应用程序(在4G RAM docker容器中):
java -XX:MaxNewSize=2550m -XX:NewSize=2550m -Xms3750m -Xmx3750m -XX:+PrintGCTimeStamps -XX:+PrintGC -cp my.jar my.My
所以我希望从3750M的堆2550M将用于新空间来提供GET请求,而1200M将用于旧版本。 在我的申请工作期间,我有
[Full GC (Ergonomics) 2632447K->1086729K(3298304K), 2.3360398 secs]
因此,对我来说,触发完整的GC看起来很奇怪。我的理解是,因为GET请求不会添加任何长寿数据,所以当新一代充满时,它应该只是Minor GC。所以我不明白
1)为什么运行Full GC(人机工程学) - 是否要更改生成布局?
2)为什么只有2632447K的3298304K被占用时它才会运行?
答案 0 :(得分:2)
几点:
GET / POST与它无关,你为GET / POST实现的逻辑是重要的......例如GET方法可能有内存泄漏......
增长记忆并不一定会减少GC(它不能线性地工作)
GC通常每个GB会冻结约1秒,所以你有13秒的时间冻结1 GB值得检查
下一步应该是enabling GC log并进行分析,以便更好地了解问题