检测Java字符串对象的大小会得出错误的结果

时间:2018-10-16 05:57:36

标签: java instrumentation objectsize

我正在使用java.lang.instrument.Instrumentation包来计算Java字符串的大小。我按照列出的here步骤创建一个Java代理jar。以下是调用Java代理类

的应用程序代码
public static void main(String[] args) {
    String string = "A very long string which I have trimmed for this example";

    StringBuilder sb = new StringBuilder(string);
    for (int i=0; i<16000; i++) {
        sb.append(string);
    }

    printObjectSize(sb.toString());


}

private static long printObjectSize(Object object) {
    final long objectSize = ObjectSizeFetcher.getObjectSize(object);
    System.out.println("Object type: " + object.getClass() + ", size: " + objectSize + " bytes");
    return objectSize;
}

这里ObjectSizeFetcher是Java代理中的类,它在内部调用检测代码。不管字符串有多大,我总是得到的输出为

Object type: class java.lang.String, size: 24 bytes

出什么问题了?

1 个答案:

答案 0 :(得分:2)

String对象不包含String数据,而是包含实际数据的byte []或char []的包装。

您需要提取基础数组并获取其大小。

String对象应该大约为24个字节。