性能问答>为何我的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相关的了,所以有些概念记得不是那么清楚了,表述中如有不对的地方,请指正。

5411 阅读
请先登录,再评论

ygc原因就是这个。也就是eden区内存不够分配失败触发ygc。jdk8默认输出gc原因。jdk7也可以通过参数配置PrintGCCause。非常正常的现象

1年前
回复 ∝独角没有戏、:

必须要100%才扩容吗?

1年前回复
回复 贞洁在哪儿?:

设置了Xmn就不会自动扩容了

1年前回复
回复 ∝独角没有戏、:

会跟进之前GC的实际使用情况来觉得要不要扩容,扩容有时候是防患于未然

1年前回复
查看更多

扩容也是在GC之后才扩的,当然有些GC算法会先尝试扩容一下

1年前
回复 陌路流氓:

你指定下-Xmn会比较好

1年前回复
回复 风吹屁屁凉:

为什么eden区的值那么小呢?只有32M

1年前回复

话说你这个jdk 的版本是多少啊,好像看不出来,jinfo pid 看看?

1年前
回复 csyangchsh:

gc日志中gc时出现了Def New字样,应该是使用的serial垃圾回收器

1年前回复
回复 陌路流氓:

可能是AdaptiveSizePolicy的锅。JDK 8默认使用 UseParallelGC 垃圾回收器,默认使用AdaptiveSizePolicy。试试 -XX:-UseAdaptiveSizePolicy。

1年前回复
回复 呵呵_416895:
java.runtime.name = OpenJDK Runtime Environment
java.vm.version = 25.252-b09
sun.boot.library.path = /usr/local/openjdk-8/jre/lib/amd64
java.protocol.handler.pkgs = org.springframework.boot.loader
java.vendor.url = http://java.oracle.com/
java.vm.vendor = Oracle Corporation
java.class.version = 52.0
sun.management.compiler = HotSpot 64-Bit Tiered Compilers
os.version = 3.10.0-1062.1.2.el7.x86_64

VM Flags:
Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=25165824 -XX:MaxHeapSize=1180696576 -XX:MaxNewSize=393543680 -XX:MaxRAMPercentage=null -XX:MinHeapDeltaBytes=196608 -XX:NewSize=8388608 -XX:OldSize=16777216 -XX:+PrintGC -XX
:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseContainerSupport
Command line: -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0

docker file中基础镜像: FROM openjdk:8

1年前回复