【发布时间】:2013-09-25 14:24:32
【问题描述】:
我编写了一个简单的程序来了解 VisualVM 的工作原理。完整代码如下:
package memorygames;
public class MemoryGames
{
static class A {
private int i;
private String s;
A(int i, String s)
{
this.i = i;
this.s = s;
}
public int getI()
{
return i;
}
public String getS()
{
return s;
}
}
public static void main(String[] args) {
A a = new A(23, "hello");
while(true) {
System.out.println(a.getS());
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
现在我在 VisualVM 中创建我的应用程序的 HeapDump。我看到了我的“A”类的实例,但是 s 变量是空的!它的值等于null。 'i' 变量的正确值是 23。
为什么会这样?
更新: 可能是我在滥用 VisualVM 吗?这是我的截图: http://oi42.tinypic.com/2091qfl.jpg
更新: 不确定,但这可能是一些内存优化的结果。我已经添加了
while(true) {
a.setS(new String("a-setter " + Math.random()));
(...)
}
... 现在我可以看到变量中的字符串值。我想知道其他人是否真的可以看到与我不同的堆中的结果。
【问题讨论】:
-
代码没问题。如果没有设置器,您甚至可以创建字段
private final int/String。 -
事实上,当我自己尝试代码时,它工作得很好,我可以正确检查 VisualVM 中的
s变量。 -
Dolda,我已经用我的 VisualVM 的屏幕截图更新了帖子。你真的有与 not-null s 变量相同的图片吗?
-
是的,我确实有同一张图片,但不是空的
s。
标签: java heap-memory visualvm