线上说明:服务器和设备是长连接,挂掉重启后,几千台设备长连接数据过来很多;
出现问题点:redis 采用jedisPool连接池,多线程调用下,连接4分片集群Redis,连接数1500条, jedisPool.getResource() 出现为空,连接数不够用,疯狂报错;
造成结果:服务线程数猛增,大量报错,服务启动失败,需要通过控制端口开关进行开启和关闭;
经jstat 检查:启动到大批量设备连上期间——FullGC 十几次 YGC 更是超过200+;
检查:
1.一开始以为是Redis 线程不够用,从1500新增到2000再到3000条,服务更是卡死,判断和连接池无关;
2.加大堆栈大小,重新分配老年代和新生代比例,怎么调整都失效
3.看了java1.8 jvm相关信息,还有永久代对应的数据,1.8以后元数据移到一个新的区域中,称为Metaspace;Metaspace的初始大小,默认值为21M,看了别人的配置,启动脚本新增-XX:MetaspaceSize=256m,问题解决,看了下具体的GC内容:
启动后FULLGC 为0