作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想知道如果 JVM 的可用 RAM 为 4GB,是否有某种方法可以让 64 位 VM 使用 8 字节对象 header 而不是 12 字节对象 header 。
或者它在 Linux 上是这样的,如果不是在 Windows 上?有人可以用这段代码测试吗?
import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class ObjectSizes {
String s1;
String s2;
public static void main(String[] args) throws Exception {
Unsafe unsafe;
try {
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
unsafe = (Unsafe)field.get(null);
} catch (Exception ex) {
throw new RuntimeException("Can't get Unsafe instance.", ex);
}
Field s1Field = ObjectSizes.class.getDeclaredField("s1");
Field s2Field = ObjectSizes.class.getDeclaredField("s2");
long s1OffSet = unsafe.objectFieldOffset(s1Field);
long s2OffSet = unsafe.objectFieldOffset(s2Field);
System.out.println("We are running "+System.getProperty("java.version"));
System.out.println("Object header size is "+s1OffSet+" bytes.");
System.out.println("Object reference size is "+(s2OffSet-s1OffSet)+" bytes.");
}
}
最佳答案
看起来不可能在 64 位 JVM 上有一个 8 字节的对象头。 header 由“标记字”、指向对象类的指针、数组大小(如果是数组)以及到达下一个 8 字节边界的填充组成。
,------------------+------------------+------------------ +---------------.
| mark word | klass pointer | array size (opt) | padding |
`------------------+------------------+-------------------+---------------'
因此在 64 位系统上对象头可以占用少至 8 + 4 = 12 个字节,但不会更少。
关于java - RAM <4GB 的 64 位虚拟机上 Java 中的对象 header 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17335884/
我是一名优秀的程序员,十分优秀!