【问题标题】:Instrumenting java string object size gives incorrect result检测 java 字符串对象大小会给出不正确的结果
【发布时间】:2018-10-16 05:57:36
【问题描述】:

我正在使用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

可能出了什么问题?

【问题讨论】:

  • 谁说有问题? String 的字节大小和长度不一样。还有其他事情在起作用,例如编码。

标签: java instrumentation objectsize


【解决方案1】:

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

您需要提取底层数组并获取它的大小。

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

【讨论】:

  • 太棒了。拉出 char 数组并获取其大小给出了正确的结果。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-02-01
  • 2011-11-30
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多