【问题标题】:Why do VisualVM float instances not seem to include floats inside other classes?为什么 VisualVM 浮点实例似乎不包含其他类中的浮点数?
【发布时间】:2011-02-16 20:17:41
【问题描述】:

我正在查看一个运行应用程序的 java 虚拟机。 VisualVM 说 java.lang.Float 只有 102 个实例。

然而,还有一个名为 Vector3 的类,它有 80.000 个实例。所有这些实例似乎都有 3 个浮点字段。

那么,应该有至少 80.000 * 3 个浮点实例,对吧?为什么不呢?

更新: 这导致我提出一个后续问题,发布在此处:VisualVM OQL: how to search for primitive float values rather than actual Float instances?

【问题讨论】:

    标签: java debugging class instance visualvm


    【解决方案1】:

    float 是一个原始值。

    java.lang.Float 是一个对象,用于将浮点值 ('box') 包装到可引用对象中。

    浮点字段不是装箱对象的实例。这是一个原始值。

    无论您拥有多少原始字段 - 因为它们不是对象,它们不会被计入对象实例计数中。

    【讨论】:

    【解决方案2】:

    准确地说,您有大约 80.000 * 3 个引用Float 实例,但您不能保证它们不会引用相同的 Float 实例。基本上你有 102 个Float 实例,但每个实例(或者可能只有几个)在不同的地方被多次引用。

    Float 实例与所有其他原始包装器一样,是不可变的,因此这没有任何问题。

    【讨论】:

    • 似乎很难相信这 80.000 个值有这么多相等的值。一定是这样的……谢谢。事实上,我很确定我正在监控的应用程序仅使用 120 个不同的浮点值是不够的。真奇怪。
    • @Tom,你可以用这样的东西创建一个小应用程序:for( int i = 0 ; i < 121 ; i++ ) { list.add( new Float( i ) ); } 并确认,你有 +120 个不同的对象。
    • 不同之处在于我希望 Float 包含原始浮点值。
    猜你喜欢
    • 1970-01-01
    • 2011-08-01
    • 2011-11-23
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多