检测 java 字符串对象大小给出了不正确的结果
Instrumenting java string object size gives incorrect result
我正在使用 java.lang.instrument.Instrumentation
包来计算 java 字符串的大小。我按照列出的步骤 here 创建一个 java 代理 jar。下面是调用 java 代理 class
的应用程序代码
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代理中的class内部调用插桩代码。不管字符串有多大,我总是得到输出
Object type: class java.lang.String, size: 24 bytes
可能出了什么问题?
String 对象不包含 String 数据,而是包含实际数据的 byte[] 或 char[] 的包装器。
您需要提取底层数组并获取它的大小。
String 对象应该大约有 24 个字节。
我正在使用 java.lang.instrument.Instrumentation
包来计算 java 字符串的大小。我按照列出的步骤 here 创建一个 java 代理 jar。下面是调用 java 代理 class
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代理中的class内部调用插桩代码。不管字符串有多大,我总是得到输出
Object type: class java.lang.String, size: 24 bytes
可能出了什么问题?
String 对象不包含 String 数据,而是包含实际数据的 byte[] 或 char[] 的包装器。
您需要提取底层数组并获取它的大小。
String 对象应该大约有 24 个字节。