利用Arthas查找cpu 100%( 二 )

找到了调用代码
com.p.commonservice.report.controller.TableController.exec
导致CPU很高 。
再利用 jmap 导出dump
jmap -dump:file=20221107.dump pid利用mat分析定位,果然是
com.p.commonservice.report.controller.TableController.exec方法中的问题 。
方法中使用了本地缓存,找来开发人员一起分析 。自行实现了一个本地缓存,类似于HashMap 。在调用接口的时候不做diff操作,直接put 。
举例:
缓存中保存User类 。1@Data2class User {34 private String name;56 private Integer age;7}
缓存内容可能为: 1{2 "jjs":{3 "age":27,4 "name":"jjs"5 }6}
缓存同步涉及两种操作:新增和覆盖 。
两种操作均直接使用put操作实现,无论当前缓存key是否已经存在 。
这样的操作方法在业务上完全没有问题 。
但对于GC而言,每次缓存同步需要new很多新的对象,并且这些对象都将一直存活,直到被覆盖,或者晋升到老年代 。
这些缓存对象首先会被分配到年轻代,在YGC时候,这些对象都会被标记为存活 。

【利用Arthas查找cpu 100%】


推荐阅读