Skip to main content

docker

关于JVM内存泄漏之GC优化问题提出

Submitted by taotao on Fri, 06/28/2019 - 12:14

概述

根据上一篇文章,将JVM升级到212版本,并追加设置了-Xmx和-Xms参数之后,生产环境的JVM内存一直维持在300-800M之间,高负载和低负载的实例,内存开销都在这个范围之内。所以从这两天的线上验证的现象来看是符合预期的,证实了之前的猜测是正确的(之前的结论参考:JVM的内存泄漏调查)。

详细分析

下面我将结合听云监控上的数据进行分析和论证。

下图是内存开销,可以看出内存开销在500M范围以下。

tingyun_memory_size

下面是Eden区域的内存开销,可以看出eden区大小在250M之内。

JVM的内存泄漏调查

Submitted by taotao on Wed, 06/26/2019 - 19:18

概述

        最近这半个月生产环境的服务出现了一个比较奇怪的现象,相同的一个服务,有两个实例,其中一个实例的负载比较高,RPM有500-1000左右,另一个实例的RPM在20-50之间,其中低负载的实例吃的内存比较多,能吃到8G左右的内存,另一个高负载的实例,内存稳定维持在2-3个G,吃内存比较高的那个服务,运维在日常巡检的时候发现会手动重启一次服务,避免服务出现OOM的问题。因为这个问题比较频繁,所以反馈到研发这边。这个问题的经过分析定位,排除日志堆积的问题、排除是听云探针的问题之后,把原因定位在了JVM内存自动增长导致的问题,因为根据监控平台上可以看到GC的回收频次很低,因为一旦JVM可用的内存不够,如果没有设置最大可用内存,那么JVM就会自动增长,而自动增长内存后,就不会达到GC触发的条件,这样就导致内存一直增长,而没有垃圾回收的问题。

详细的分析过程

         首先让运维通过利用jmap的方式将JVM的内存信息dump出来,

jmap -dump:format=b,file=文件名.dump 进程id 

经过分析发现了听云的对象占用了大概20%左右的内存空间:

解决docker镜像耗尽本地磁盘满的问题

Submitted by taotao on Sun, 05/05/2019 - 17:54

概述

在使用docker的过程中,需要经常构建镜像,本地构建的镜像和从外部拉取的镜像就会慢慢耗尽本地的磁盘,本地磁盘被 耗尽就会导致镜像构建失败。

解决办法

docker默认是使用的是 /var/lib/docker目录,因为这个目录不是主目录,所以它的存储空间就不大。 通过如下的办法将docker的存储目录调整到主目录下去:

  1. 备份/var/lib/docker目录
mv /var/lib/docker /var/lib/docker_bak

2. 在主目录下创建一个空目录,并将docker的存储目录 软链到该目录下

mkdir ~/docker-server
cd /var/lib 
ln -s ~/docker-server docker 

通过如上步骤就可以将docker的存储目录调整到主目录下,避免镜像生成到空间小的分区中。 

Tags