Использование размера объекта Java-строки дает неверный результат - PullRequest
0 голосов
/ 16 октября 2018

Я использую пакет java.lang.instrument.Instrumentation для вычисления размера строки Java.Я следую инструкциям здесь , чтобы создать jav-агент 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 голосов
/ 16 октября 2018

Объект String не содержит данных String, но является оберткой для байта [] или символа [], который содержит фактические данные.

Вам необходимо извлечь базовый массив и получить его размер какхорошо.

Объект String должен иметь размер около 24 байт.

...