最近在学习dubbo的源码时,发现了javassit技术,接着了解了相关的asm、javaagent等字节码的一些玩法。无意间看到了btrace、arthas。接下来就是对arthas的一些玩法。
这边使用arthas去排查由于死循环引起的cpu升高问题。
问题:
例如在报错的时候打印日志时日志不全或者是没有给出错误状态码,那正常想到的就是改代码加日志重新部署?但如果是线程池的问题或者是一些不易复现,重启会破坏现场。
例如以下场景:
由HashMap、HashBiMap或者是一些不适当的操作引起的死循环问题,我们该如何去定位呢?
现场模拟
由于Map的死循环不好构建,这边模拟构建在hash桶中的链表
@Slf4j
@Component
public class SimulateHashMap implements InitializingBean {
private Node head = new Node(0);
@Override
public void afterPropertiesSet() throws Exception {
//构造出 0->1->2->3->4-> 1->2....的循环链表
Node node1 = new Node(1);
Node secondNode = node1;
head.next = node1;
Node node;
for