我正在研究java,我记得在某个地方读过java对象,在JVM中有一些开销,这是由虚拟机用于管理的原因。所以我的问题是,有人能告诉我是否以及如何在HotSpot JVM中获取对象的总大小,以及它可能带来的任何开销?
答案 0 :(得分:9)
您不能直接获得开销。开销量取决于实现,并且可能因许多因素而异(例如,精确的JVM版本,以及您是使用32位还是64位JVM)。
然而,假设在像HotSpot这样的典型现代JVM实现中,每个对象的开销<8>在16到16字节之间,这是相当安全的。数组的开销通常比其他对象大4个字节(包含整数数组长度)。
另见:
答案 1 :(得分:1)
我发现this article相当翔实,虽然我对表中提到的一些值有些怀疑
答案 2 :(得分:0)
以下是对象标头,对象开销,数组标头和对象引用的代码段。希望它对某人(如果不是OP的话)有所帮助,因为这是一个相当老的问题。
private static int OBJ_HEADER;
private static int ARR_HEADER;
private static int INT_FIELDS = 12;
private static int OBJ_REF;
private static int OBJ_OVERHEAD;
private static boolean IS_64_BIT_JVM;
static {
String arch = System.getProperty("sun.arch.data.model");
IS_64_BIT_JVM = (arch == null) || arch.contains("32");
OBJ_HEADER = IS_64_BIT_JVM ? 16 : 8;
ARR_HEADER = IS_64_BIT_JVM ? 24 : 12;
OBJ_REF = IS_64_BIT_JVM ? 8 : 4;
OBJ_OVERHEAD = OBJ_HEADER + INT_FIELDS + OBJ_REF + ARR_HEADER;
}
我应该说我只知道解决方案,但是我还没有弄清楚为什么这种方法有效。这就是为什么人们应该在代码中留下注释的原因……哦,好了,当我弄清楚它的时候,我将分享其背后的逻辑。