【现象】
应用部署实例,通过top命令查看,cpu消耗在6%到13%,但RES常驻内存(不包括swap out)持续推高迅速达到1.9G,该docker容器的物理内存为2G,意味着应用实例消耗完物理内存。
VIRT虚拟内存达到23G,VIRT包括进程使用的库、代码、数据等,而且暂不知道VIRT是指的宿主机全体还是当前应用进程的量。
VIRT:进程使用的虚拟内存。进程使用的虚拟内存总量,单位kb。VIRT = swap + RES。
swap交换区(磁盘虚拟内存)约800m被持续的used,free持续减小到0后used清零,然后重复循环, 说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。但不知道used达到800m被清零时,jiayu进程有没有full gc。
通过jstate -gcutil查看应用进程共计4次full gc。
通过jmap -dump存活堆内存快照,堆内存活对象总计只有100m。
【原因】
应用进程,启动参数没有设置堆内存大小-Xms和-Xmx,Xms默认为64m,所以当64m翻倍再翻倍时,会触发full gc也就是看到的4次。但分配达到2G之后无法分配,但进程没有设置Xmx所以无法触发堆内存满多少时full gc的阈值。所以此时堆内存实际存活对象只有100m,其余1.8G都是可回收部分,也不会发起full gc去回收。