CSUG / HouseMD

HouseMD is an awesome diagnosing tool better than BTrace
http://csug.github.io/HouseMD/
Apache License 2.0
700 stars 218 forks source link

对 spring prototype 的bean监控不准 #88

Closed JerryFang closed 11 years ago

JerryFang commented 11 years ago

OfferTransaction.doInTransaction调用了HrwRuleCheckBO.checkOffer OfferTransaction是protoType的,HrwRuleCheckBO是单例的。

housemd> trace -t 5 OfferTransaction.doInTransaction
INFO : Probe class xxx.OfferTransaction
No traced method invoked

xxx/OfferTransaction.doInTransaction()    sun.misc.Launcher$AppClassLoader@546b97fd            1          606ms    xxx.OfferTransaction@429cd7fe

xxx/OfferTransaction.doInTransaction()    sun.misc.Launcher$AppClassLoader@546b97fd            1          490ms    xxx.OfferTransaction@4e3916ae

housemd> trace -t 5 HrwRuleCheckBO.checkOffer
INFO : Probe class xxx.HrwRuleCheckBO
No traced method invoked

xxx/HrwRuleCheckBO.checkOffer(DangerousOfferCandidateVO)    sun.misc.Launcher$AppClassLoader@546b97fd           14          659ms    xxx.HrwRuleCheckBO@183357c4

xxx/HrwRuleCheckBO.checkOffer(DangerousOfferCandidateVO)    sun.misc.Launcher$AppClassLoader@546b97fd           39          698ms    xxx.HrwRuleCheckBO@183357c4
zhongl commented 11 years ago

你好, 感谢你的反馈!

我有点不是很明白你认为不准的依据是什么?

上面两次trace的结果, 你是认为:

  1. 前者是准的, 所以后者是不准的?
  2. 后者是准的, 所以前者是不准的?
  3. 不知道哪次是准的, 觉得它们结果应该是一致的才准?
  4. 以上都不是, 还请具体说明你认为什么才是准?
JerryFang commented 11 years ago

结果一直才是准的,至少调用次数应该相差不大。 OfferTransaction.doInTransaction调用了HrwRuleCheckBO.checkOffer,每次都会有调用。 区别在于OfferTransaction在spring中配置是protoType(每次调用new一个),而HrwRuleCheckBO配置是singleton。 不太清楚housemd实现原理,是不是1s中内创建并回收了的对象就监控不到了。

zhongl commented 11 years ago

HouseMD每次trace统计的调用次数, 是从Probe class开始计数, 直到Reset class后结束计数.

多次trace之间的计数毫无关联, 所以可能一致, 也可能不一致.

不太清楚housemd实现原理,是不是1s中内创建并回收了的对象就监控不到了。

有兴趣, 请看这里的文档获知答案 http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#retransformClasses(java.lang.Class...)