性能问答>为何我的JVM应用总是Allocation Failure,并且Young Generation不自动扩容?>
13回复

为何我的JVM应用总是Allocation Failure,并且Young Generation不自动扩容?



我的java应用部署在k8s集群中,对于pod我做了如下限制:

limits.memory = 1500Mi
request.memory = 750Mi

kubernetest memory limit 官方参考文档

然后JVM应用启动设置的参数如下:

-Xloggc:gc.log 
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps -XX:+PrintHeapAtGC 
-XX:+PrintTenuringDistribution

-XX:+UseContainerSupport 
-XX:MaxRAMPercentage=75.0

根据上面设置, MaxHeapSize = 1500 * 0.75 = 1125M

同时由于没有指定垃圾收集器,我根据gc.log文件中的内容判断出年轻代使用的是Serial收集器(DefNew),老年代应该是Serial Old(没有指定CMS)。

image.png

同时gc日志中也出现了大量的 [GC (Allocation Failure)

jmap命令输出内容如下:
image.png

按照我的理解,年轻代追到为375M,初始值为8M,按照我的理解是eden区最大值应该为 375*0.8=300M.

但是jmap中显示只使用了28M,上面也提到过大量出现了GC (Allocation Failure),那么为什么年轻代不扩容呢? 最大不是300M吗?(是否需要指定-Xmn?)

jstat 统计情况:
image.png

好久没有处理过JVM相关的了,所以有些概念记得不是那么清楚了,表述中如有不对的地方,请指正。

6352 阅读
请先登录,查看13条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步