java - 检测 java 字符串对象大小给出了错误的结果

标签 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

可能出了什么问题?

最佳答案

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

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

String 对象应约为 24 个字节。

关于java - 检测 java 字符串对象大小给出了错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52828761/

相关文章:

java - Hibernate Maven 增强插件配置

java - 为什么压缩的 Oops 为 Object Header 提供 12 个字节

java - 如何将匿名类(不是实例)作为参数传递给在 Java 中期望类型为类的方法

java - Java JVM 是否执行任何特化或部分评估类型优化?

java - 响应200正常,然后转到错误行

java - 如何使用 Java 将系统时间插入到 Ms Access 中?

linux - 使用 -finstrument-functions 构建 glibc

java - Java中有没有一种方法可以使用Instrumentation来拦截对象的创建?

java - 使用 Instrumentation 获取对象大小