13回复
4年前
为何我的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)。
同时gc日志中也出现了大量的 [GC (Allocation Failure)
jmap命令输出内容如下:
按照我的理解,年轻代追到为375M,初始值为8M,按照我的理解是eden区最大值应该为 375*0.8=300M.
但是jmap中显示只使用了28M,上面也提到过大量出现了GC (Allocation Failure),那么为什么年轻代不扩容呢? 最大不是300M吗?(是否需要指定-Xmn?)
jstat 统计情况:
好久没有处理过JVM相关的了,所以有些概念记得不是那么清楚了,表述中如有不对的地方,请指正。
6291 阅读