2

我试图测量 A 类的一个实例的大小:

package pkg;
class A {
    private int i;
}

使用 VisualVm 的结果是 20 个字节: 在此处输入图像描述

但是使用 JOL 的结果是 16 个字节:

pkg.A object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0    12        (object header)                           N/A
     12     4    int A.i                                       N/A
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

这是我用于此测试的完整代码:

package pkg;

import org.openjdk.jol.info.ClassLayout;

import static java.lang.System.out;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        A a = new A();
        out.println(ClassLayout.parseClass(A.class).toPrintable());
    }
}

class A {
    private int i;
}

我是否滥用了这些工具或误解了它的结果?我期望这两种工具都能得到相同的结果。

4

2 回答 2

1

你可能不会喜欢它......但是VisualVM谎言,正如这里所解释的那样(来自同一个伟大的 Shipilev 的更深入的视频,但我似乎找不到它)

相信JOL,它正确地向您显示结果。

于 2018-03-08T20:14:49.540 回答
0

因为你正在使用ClassLayout.parseClass(A.class).

如果要测量a(实例A)的内存利用率,请尝试

ClassLayout.parseInstance(a).toPrintable()
于 2017-10-22T12:06:50.410 回答