我想在运行时确定我的类的大小。在C中我这样做:
struct
{
int id;
char name[30];
} registry
void main()
{
int size = sizeof(registry);
}
我如何用Java做到这一点?
答案 0 :(得分:1)
你做不到。 Java虚拟机不希望您知道它。
可能还有其他方法可以用这些信息做你真正想做的事。
答案 1 :(得分:1)
VM在内部存储变量等方面有所不同。大多数现代32位虚拟机都很相似。您可以估计类实例的浅层大小,如下所示:
sizeInBytes = C + 4 * (fieldCount)
其中C是常数。
这是因为通常所有字段都有一个字宽,在JVM内部通常仍然是4个字节。类的深度大小更难计算,但基本上你递归地添加每个引用对象的大小。对于布尔值和字节,数组的大小通常为1*arr.length
个字节,对于字符和短路,2*arr.length
,对于整数和浮点数,4*arr.length
,对于双精度和长整数,8*arr.length
。
在运行时获得估算的最简单方法可能是在实例化类的对象时测量Runtime.freeMemory()
的变化。当然,这些都不应该用于程序逻辑;只是为了JVM调整或好奇。
答案 2 :(得分:0)
查看ClassMexer,它只是新java.lang.instrument.Instrumentation接口的一个简单实现。只需按照相当简单的说明操作即可。
它可能过于干扰你的使用,因为它作为javaagent运行,但从你的例子它应该没问题。
答案 3 :(得分:0)
你可以得到一个估计,如果有困难,得到确切的数字。为什么有必要?