为什么 VisualVm 和 JOL 工具对对象大小给出不同的结果
Why VisualVm and JOL tools give different results for object size
我已经尝试测量 class 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;
}
我是否滥用了这个工具或误解了它的结果?
我期望从这两种工具中得到相同的结果。
因为您正在使用 ClassLayout.parseClass(A.class)
。
如果要测量 a
(A
的实例)的内存利用率,请尝试
ClassLayout.parseInstance(a).toPrintable()
你可能不会喜欢它......但是 VisualVM
谎言,正如解释的那样 here(同样伟大的 Shipilev 有一个更深入的视频,但我好像找不到)
相信JOL
,它向您显示的结果是正确的。
我已经尝试测量 class 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;
}
我是否滥用了这个工具或误解了它的结果? 我期望从这两种工具中得到相同的结果。
因为您正在使用 ClassLayout.parseClass(A.class)
。
如果要测量 a
(A
的实例)的内存利用率,请尝试
ClassLayout.parseInstance(a).toPrintable()
你可能不会喜欢它......但是 VisualVM
谎言,正如解释的那样 here(同样伟大的 Shipilev 有一个更深入的视频,但我好像找不到)
相信JOL
,它向您显示的结果是正确的。