快捷搜索: 王者荣耀 脱发

运维中遇到的GC频繁告警问题处理方式

自己工作那么久很少接触到内存调整方面的问题,很巧的是最近两个系统频繁出现了GC回收始终高于75%同时长久不触发OC的回收。自己看到这些很是开心啊,终于有了机会来体验面试中常问的是否有过内存调优方面的经验,哈哈,我再也不空白了。。。。。。。

1、WebLogic中间件频繁告警GC回收率高于75%。自己首先打出hrof的heapdump然后通过mat工具查看内存使用情况。

从mat中可以看到内存有620M都被MemorySessionContext占用,当时按网上说的点击Detail查看后发现有个char[]很大,不是太清楚Shallow Heap的意思,就直接和开发确认看是哪个地方用了这个char,是否存了较大的数据。开发确认没有大的数据存到session中。

能够肯定的是session这块肯定有问题,自己又继续研究mat分析日志的方式,通过Dominator Tree处看这里看的很清楚MemorySessionContext占用内存86.98%,点开session类可以看到有27000多个hashtable对象。然后再点开看到ROOT是organization对象,通过与开发确认每个用户都会将自己的组织机构存到session中。与开发确认session失效的时间时发现,用户的session失效配置成了1个小时,将客户session保持时长调整为15分钟后再未发生gc回收告警。

2、刚处理完上个问题后发现另一个tomcat的gc回收总是告警,此时只发生在应用的其中一台中,并不像上面的是所有应用都会发生。当重启了告警的那台后其他主机中的一台又会发生,并且每次只会有一台。当时觉得很奇怪,首先想到的是否有quartz在某台跑并且只在一个上面跑,和开发确认后发现无此类的quartz。

自己就通过jstat -gcutil pid 2000 10打印了内存的使用情况,由于没保留现场无法放到这里了,只能说些看到的情况。当时配置的是jvm内存为1G,新生代为128M,持久代为256M,老生代自己算下吧。发现老生代里的内存一直保持在80%多点,而新生代中的1个E和2个S频繁的在交换和回收,每次写入老生代的内容很少。看回收次数发现,GC次数很高OC次数很低。从这些现象可以知道,新生代配置过小老生代配置过大,一直无法触发OC的回收长期使jvm较高。将新生代调整为256M重启应用后再无告警产生。显示内存回收正常。

 
经验分享 程序员 微信小程序 职场和发展