Javaはオブジェクトのメモリアドレスを取得します

序文

Java では、synchronized現在のインスタンス オブジェクトが同期メソッドに対してロックされていることがわかっています。
たとえば、次のコード部分は次のとおりです。

import java.util.concurrent.TimeUnit;

public class Test {
    
    
    public static void main(String[] args) {
    
    
        Test test = new Test();
        test.helper();
    }

    public synchronized void helper() {
    
    
        try {
    
    
            System.out.println("hello");
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
    }
}

ダンプ後、次の情報を取得できます。

"main" #1 prio=5 os_prio=0 tid=0x00c46c00 nid=0x1d60 waiting on condition [0x00ddf000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
	at java.lang.Thread.sleep(Native Method)
	at java.lang.Thread.sleep(Thread.java:340)
	at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
	at Test.helper(Test.java:16)
	- locked <0x09db48c0> (a Test)
	at Test.main(Test.java:10)

Test のインスタンス テストのメモリ アドレスは <0x09db48c0> です。このアドレスがメモリアドレスであることをどのように確認すればよいでしょうか?

文章

依存関係を導入する

pom.xml に依存関係を追加します。

        <dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.10</version>
        </dependency>

使用

使い方は簡単です:

VM.current().addressOf(test)

これをコードに組み込むと次のようになります。

import org.openjdk.jol.vm.VM;

import java.util.concurrent.TimeUnit;

public class Test {
    
    
    public static void main(String[] args) {
    
    
        Test test = new Test();
        System.out.println("The memory address is " + VM.current().addressOf(test));
        System.out.println("The memory address is " + Long.toHexString(VM.current().addressOf(test)));
        test.helper();
    }

    public synchronized void helper() {
    
    
        try {
    
    
            System.out.println("hello");
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
    }
}

コンソールで出力を確認できます。

The memory address is 165365952
The memory address is 9db48c0
hello

結論は

導入することでorg.openjdk.jolオブジェクトのメモリアドレスを素早く取得できます。関連するソースコードをざっと見てみると、最下層はunsafeクラスを使用して判断されていることがわかります。

JOL (Java Object Layout) は、JVM のオブジェクト レイアウト スキームを分析するための小さなツールボックスです。これらのツールは、実際のオブジェクトのレイアウト、フットプリント、参照をデコードするために Unsafe、JVMTI、Serviceability Agent (SA) を多用しています。これにより、JOL はヒープ ダンプや仕様の仮定などに依存する他のツールよりもはるかに正確になります。

(Java Object Layout) は、JVM のオブジェクト レイアウト スキームを分析するための小さなツールボックスです。これらのツールは、Unsafe、JVMTI、Serviceability Agent (SA) を多用して、実際のオブジェクト レイアウト、メモリ フットプリント、参照をデコードします。これにより、JOL はヒープ ダンプや仕様の仮定などに依存する他のツールよりも正確になります。

おすすめ

転載: blog.csdn.net/sayWhat_sayHello/article/details/119334690