没有打印日志时,排查生产问题,怎么办?( 二 )


2. with
代表所有引用了当前对象的对象集合
这两个选项的功能要理解清楚,关于他们的作用,看下面的例子:
public ClassA{private B b = new B();// b对象private Map map = new HashMap(); // map对象public A(){C c1 = new C(); // c1对象map.put("c1",c)}}Class B{private C c= new C();// c对象}Class c{private String str="1" // str对象}A a = new A()// a对象
上面的示例,可以得出以下结论:
如果一遍没有看懂上面的示例,建议多看几遍 。
再回到我们的分析中,我们要找出谁引用了类的这个实例对象作为缓存的key,所以选择 菜单,如下图所示:
列表中只有一条记录,说明这个的这个示例对象只被引用了一次,展开后的对象就是引用了实例对象的对象,看图可知,是一个对象内部类的Node节点对象引用了它(不知道这里在说什么的,去看下的源码) 。点击这个对象,左边选项卡列出了Node对象的四个成员变量,我们关注的是key和value,key就是对象,value则是一个对象,它是机构产品计费策略对象,很明显不是我们要找的对象 。
通过这种方式我们排查前三个对象都是不同日期的计费策略缓存对象,他们都是被的node对象引用的机构产品计费策略 。再分析第四个对象的 :
5. 适用场景
因为是通过抓取堆快照的方式,所以只能保存dump堆那一时刻内存中的变量,此种方法适用于常驻内存的变量的查找,例如缓存,全局变量等,针对那些局部变量,能否抓取到,就要看运气了 。
上面示例中的堆快照文件本来想提供,但是涉及到公司的一些信息,所以大家自己写个demo,按照上面方式分析一下,就不提供了 。