【线上问题】GC时长过长
背景
机器背景:POD内存小,仅1G
业务背景:服务商三方应用,企业微信拉取消息,涉及到对消息key的解密。解密操作代码书写不当,导致大量对象被创建,过早进入老年代,触发FullGC停机
排查思路
问题感知
GC过长系统告警
Grafana监控显示服务停机
排查流程
查看监控,发现是GC导致
导出堆文件,对堆文件进行分析
由图中可以看出,公私钥加解密实体被过多创建
回顾代码
原来的代码中,每次解密都回去创建一个BouncyCastleProvider对象。
每一条企微消息,都会调用decrypt方法。当消息拉取量过大时,就会导致BouncyCastleProvider对象被过多的创建
1 | public static String decrypt(String encryptedData, PrivateKey privateKey) throws Exception { |
解决方案
对Cipher增加LRU本地缓存
1 | private static Cache<String, Cipher> CACHE = CacheBuilder.newBuilder() |
对POD内存调整
增加POD整体内存,扩大年轻代
原配置
1 | -Xms1g -Xmx1g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Xmn384m -XX:MaxDirectMemorySize=256m |
新配置
1 | -Xms2g -Xmx2g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=521m -Xmn768m |
- Post title:【线上问题】GC时长过长
- Post author:大黄
- Create time:2024-07-13 16:26:51
- Post link:https://huangbangjing.cn/2024/07/13/【线上问题】GC时长过长/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.