分析线上JVM内存占比高问题

推荐公众号

彩蛋哦!!!(或者公众号内点击网赚获取彩蛋)
分析线上JVM内存占比高问题

前言

今天老大突然告诉我说 让我搞一下测试服务器 ???WHAT 服务器不是一直都是运维搞的吗?原来运维发现测试服务器越来越卡,查看了占用内存的进程,发现竟然是几个后台应用,嗯???其中一个后台应用我是知道的,是用来做数据处理的,对象基本上都是 朝生夕死,内存应该丢会被回收掉,当然内存会有峰值但是估计最多也就1G,但是运维告诉我这个应用平常的内存占用就是3G。这种情况一般就是内存泄漏了

分析过程

是否存在内存泄漏

把堆镜像转出来分析一下(怎么分析的下次再说),分析下来是有很多对象存在内存中,但是查找相关代码并没有内存泄漏情况。这就令人费解了,正当发愁时忽然想到之前遇到一种情况,没有内存泄漏但是年轻代占用异常高,最大堆没有限制(64位默认8G)

分析内存使用情况

分析线上JVM内存占比高问题
从上面可以看到总堆大小8G默认的堆大小,eden区2.5G,使用情况2.3G,使用率95.3% 这。。。。年轻代中一般朝生夕死过一段时间就会被GC掉,不会占用很大的内存空间(理解的不深,如果有更好的意见请加微信交流15938289083)。运维也不知道之前的参数,这只能慢慢调整了不能一下设置的太小,暂时先设置一个最大堆-Xmx2048M 年轻代:年老代=1:2 eden:from space:to space = 8:1:1,以后根据内存使用曲线个GC情况进行调整。更改完参数之后再看线上内存的确好了不少,但是以后还需要根据实际使用情况调整。