10

とにかくJVMに使用可能なRAMが4GBの場合、64ビットVMに12バイトのオブジェクトヘッダーの代わりに8バイトのオブジェクトヘッダーを使用させる方法があるかどうか知りたいと思いました。

それとも、Windowsではなくても、Linuxではそうですか?誰かがこのコードでこれをテストできますか?

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.");
    }
}
4

3 に答える 3

17

64 ビット JVM で 8 バイトのオブジェクト ヘッダーを使用できるようには見えません。ヘッダーは、「マーク ワード」、オブジェクトのクラスへのポインター、配列の場合は配列サイズ、および次の 8 バイト境界に到達するためのパディングで構成されます。

  ,------------------+------------------+------------------ +---------------.
  |    mark word     |   klass pointer  |  array size (opt) |    padding    |
  `------------------+------------------+-------------------+---------------'

したがって、64 ビット システムのオブジェクト ヘッダーは、わずか 8 + 4 = 12 バイトしか占有できませんが、それ以下ではありません。

于 2013-06-27T16:24:46.237 に答える
3

For 64 bit VMs there are options:

  1. Using compressed pointers via -XX:+UseCompressedOops (enabled by default on Java 6)

In that case: object headers will be 12 bytes, array headers will be 16 bytes (last 4 byte for size of array)

2.Not using compressed pointers via -XX:-UseCompressedOops

In that case: object headers will be 16 bytes, array headers will be 20 bytes (last 4 byte for size of array)

The code given above is not VM bit-size independent and will give different results for 32-bit and 64-bit vms. You need to consider bit-ness and compressed oops factors to compute correct size.

于 2014-01-26T08:31:45.983 に答える
-1

-XX:+UseCompressedOops による圧縮ポインタの使用 (Java 6 ではデフォルトで有効)

これは、Java 6 のすべてのバージョンに当てはまるわけではありません-XX:+UseCompressedOops。Java 6u25 以降では、デフォルトで有効になっています。

于 2015-02-11T16:09:58.800 に答える