1

重複の可能性:
Javaオブジェクトのアドレスを取得する方法は?
Javaの変数のメモリアドレス

オブジェクトのヒープアドレスを表示または書き込む方法はJavaにありますか。私は長いオブジェクトを持っていると言います

Long mylong = Long.valueof(1);

値(1)ではなく、mylongのヒープアドレスを確認したい。可能かどうか知りたいです!私はそれが可能であることを知っています、そしてそれはアプリケーションで役に立たないかもしれません。しかし、場合によっては、JVMがどのように機能しているかを知る方法を探しています。

Eclipseプラグインのようにこれを行うツールの場合は、お知らせいただければ幸いです。

4

2 に答える 2

1

オブジェクトのヒープアドレスを表示または書き込む方法はJavaにありますか?

短い答え; 番号。

長い答えは; それは役に立たないので、あなたはしたくありません。Unsafeを使用してこの情報を取得できますが、参照はいつでも変更できます。

注:参照は32ビットJavaのアドレスですが、64ビットJavaでは、JVMが最大32 GBのヒープに対して32ビット参照を使用できるように、参照に8を掛けたりオフセットしたりすることがよくあります。

于 2012-08-30T14:10:32.910 に答える
1
import java.lang.reflect.Field;

import sun.misc.Unsafe;

public class Direct {

    public static void main(String... args) {
        Unsafe unsafe = null;

        try {
            Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);
            unsafe = (sun.misc.Unsafe) field.get(null);
        } catch (Exception e) {
            throw new AssertionError(e);
        }

        long value = 12345;
        byte size = 1;
        long allocateMemory = unsafe.allocateMemory(size);
        unsafe.putAddress(allocateMemory, value);
        long readValue = unsafe.getAddress(allocateMemory);
        System.out.println("read value : " + readValue);

    }
}

から取られた:ここから取られた

于 2012-08-30T14:10:51.070 に答える