java检测返回的大小单位
我使用下面的java项目来确定对象的大小 我得到的结果如下 144Kb,64Kb,72Kbjava检测返回的大小单位,java,instrumentation,Java,Instrumentation,我使用下面的java项目来确定对象的大小 我得到的结果如下 144Kb,64Kb,72Kb 这里的“b”代表位还是字节 为什么在上述情况下,当我更改字符数时,输出没有更改?有时增加,有时不增加 它似乎在使用Java插装代码 似乎正在使用以下包:java.lang.instrument.Instrumentation 但不确定包的API是否返回以位或字节为单位的对象大小。您指向的链接指出: 使用humanReadable()方法以字节、千或兆为单位获取对象大小(如果你需要千兆,麻烦的家伙!):
但不确定包的API是否返回以位或字节为单位的对象大小。您指向的链接指出:
使用humanReadable()方法以字节、千或兆为单位获取对象大小(如果你需要千兆,麻烦的家伙!):
所以它似乎不是零零碎碎的
关于你的第二个问题,我没有答案。我猜字符串使用的缓冲区的大小大于字符串的大小,因此您可以在缓冲区变大之前添加几个字符。此工具似乎有点过时。作为一个替代方案,我可以推荐优秀的,现在已经在OpenJDK下发布了。 它甚至比sizeOf更好,支持许多很酷的功能。
另外,请查看哪个演示了此工具的使用。我不相信对于这样小的对象,您会得到“144Kb、64Kb、72Kb”这样的结果。很可能您得到了
144.0b
,64.0b
,以及72.0b
政府已经毫无疑问地说:
System.out.println(SizeOf.deepSizeOf())//这将以字节为单位打印对象大小
如果您对SizeOf.humanReadable
的作用持怀疑态度,您可以省略其调用,直接打印SizeOf.deepSizeOf
的结果
由于
skipStaticField
,skipFinalField
,skipFlyweightObject
是三个标志,因此允许八个组合,但您只发布了三个结果,而没有说明使用的组合,因此很难解释结果。特别是,由于String
的实现在Java版本之间发生了变化,并且您没有指定使用的Java版本
当指定了skipFlyweightObject
时,插入的String
s(如源代码中的literalString
s)不计算在内。如果未指定,但skipFinalField
为,则会计算字符串的平面对象存储,但会忽略其char[]
内容,因为它是使用final
字段引用的。如果所有的<代码> char < /代码> s都被计算,那么你必须考虑到大多数实现都有一个对象大小填充,在报告对象大小时可以考虑。
似乎在Oracle的JVM中,每个对象的大小都是8字节的倍数。因此,在char
数组的对象大小增加到下一个八字节的倍数之前,您最多可以添加四个UTF-16
字符
您可以使用SizeOf.turnOnDebug()
了解如何计算对象大小。但是您应该始终记住,这样的累积大小可能包括在不同对象图之间共享的对象,因此加起来比实际使用的堆存储大得多
也要考虑的是,这个代码的后端是什么?
返回指定对象消耗的存储量的特定于实现的近似值。结果可能包括对象的部分或全部开销,因此有助于在实现内进行比较,而不是在实现之间进行比较。在JVM的单个调用过程中,估计值可能会发生变化。(我强调)
如果是零碎的,我会很惊讶。不确定更改“字符数”时要更改什么,但请记住,字符串
引用只是一个引用。这些引用必须是字节,而不是“Kb”,对吗?
public class DataClass /*implements Serializable*/{
// private static final long serialVersionUID = 5199373516861766638L;
String name = "GUNJ";
String lastName= "";
// int age = 148888890;
@Override
public String toString() {
return "DataClass{" +
"Name='" + name + '\'' +
", Last Name='" + lastName + '\'' +
", Age=" +
'}';
}
public static void main(String[] args) {
// SizeOf.skipStaticField(true);
// SizeOf.skipFinalField(true);
// SizeOf.skipFlyweightObject(true);
System.out.println(SizeOf.humanReadable(SizeOf.deepSizeOf(new DataClass()))); //this will print the object size in bytes
}
}