Java VisualVM:在我的HeapDump中,字符串变量总是空的

Java VisualVM:在我的HeapDump中,字符串变量总是空的,java,heap-memory,visualvm,Java,Heap Memory,Visualvm,我编写了一个简单的程序来理解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; }

我编写了一个简单的程序来理解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中对我的应用程序进行了大量转储。我看到了我的'A'类的实例,但是s变量是空的!它的值等于null。'i'变量保持正确的值23

为什么会发生这种情况

更新: 可能是我误用了VisualVM?这是我的截图:

更新: 不确定,但这可能是内存优化的结果。我补充说

 while(true) {
            a.setS(new String("a-setter " + Math.random()));
            (...)
}

。。。现在我可以看到变量中的字符串值。我想知道其他人是否真的能在堆中看到与我不同的结果。

这可能是您用于运行示例的JDK的问题。你能试试不同版本的JDK吗?JDK7U40还是JDK8预览版?它适合我使用JDK 7u40。

代码很好。如果没有设置器,您甚至可以创建字段
private final int/String
。事实上,当我自己尝试代码时,它工作得非常好,我可以正确地检查VisualVM.Dolda中的
s
变量,我已经用我的VisualVM的屏幕截图更新了帖子。你真的对not null s变量有相同的图片吗?是的,我确实对non null
s
有相同的图片。这是我的版本,将寻找另一个:java版本“1.6.0_33”java(TM)SE运行时环境(构建1.6.0_33-b03-424-11M3720)java热点(TM)64位服务器虚拟机(构建20.8-b03-424,混合模式)请尝试JDK 7u40。我记得有时候字符串常量不是堆转储的一部分。您好@TomasHurka您能详细说明一下字符串常量不是堆转储的一部分吗?我在堆转储(Java6)中看到一些奇怪的字符串空值,我想找到一个权威参考来描述这一点。谢谢