【问题标题】:VisualVM: in my HeapDump String variables are always nullVisualVM:在我的 HeapDump 字符串变量中始终为空
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 这是我的版本,将寻找另一个:java 版本 "1.6.0_33" Java(TM) SE 运行时环境 (build 1.6.0_33-b03-424-11M3720) Java HotSpot(TM) 64 -Bit Server VM(build 20.8-b03-424,混合模式)
  • 请尝试 JDK 7u40。我确实记得有时字符串常量不是堆转储的一部分。
  • 嗨@TomasHurka 你能详细说明不属于堆转储的字符串常量吗?我在堆转储(Java 6)中看到一些奇怪的字符串空值,我想找到一个描述这一点的权威参考。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多