我有一个可以通过jconsole / Visual VM访问的服务。
@ManagedResource
public class MyService
{
private String foo;
@ManagedAttribute
public void setFoo(String newVal) { this.foo = newVal; }
@ManagedAttribute
public String getFoo() { return this.foo; }
//some other things here that access foo
}
但看起来网络应用控制器收到的foo
的值并不总是与我在jconsle或visual VM中点击getFoo()时得到的值相匹配。
此外,调试器向我显示我的控制器得到的值不是我在jconsole中看到的值。
有什么想法吗?
答案 0 :(得分:2)
但看起来web应用控制器收到的foo值并不总是与我在jconsle或visual VM中单击getFoo()时得到的值相匹配。此外,调试器向我显示我的控制器得到的值不是我在jconsole中看到的值。
我不确定,但我怀疑值foo
在各个线程之间没有正确的内存同步。如果foo
由显示该值的线程更新,则应使volatile
为private volatile String foo;
- 或者使JMX过期。
MyService
当然,JMX请求是由您的Web应用程序处理的不同线程制作的。但是,我会想,调试器不会有问题。
修改强>
经过一番来回,我问是否有可能创建/使用了System.out.println("getting foo in " + System.identityHashCode(this) + " = " + foo);
类的2个实例。 @abcXYZ向getter和setter方法添加类似{{1}}的内容,这些方法显示 实际上有两个不同的类实例。
因此,当Web应用程序使用另一个时,JMX线程正在查看其中一个。哎哟。