Jasmin アセンブリで新しいアイテムを作成して保存する場合、アドレスであるため、命令をロードして実行します。
new Object
dup
invokespecial.....
astore_3 ; load the object reference into local variable 3
ここで、定数プールから文字列を保存したい場合... ldc で作成し、aload で保存します。
ldc "Great string"
astore_3 ; save the reference to the actual string in the constant pool
さて...これらのアドレスは同じ形式で同じバイト数ですか? これらのアイテムのロードと格納に同じ命令を使用するため、JVM は、定数プールに属するアドレスとヒープ内のアドレスを区別できなければなりませんか?
バイトコードを調べると、私の場合、定数プール内の実際のアドレスは 1 バイトのインデックスにすぎないようです (定数プールへの主な参照もどこかに保持されていると思います)...今、それが定数プール内のsom UTF8データへの参照ですが、それは実際の文字列がある場所ですか、それとも別の場所のバイト配列への参照ですか? ヒープ内の「新しいオブジェクト」のアドレスを検査することはできませんでした.....基本的に、これら2つのメモリ領域が同じ形式の命令を使用する方法と、JVMがどのように管理するかを理解する必要がありますアドレスが定数プールのオフセットなのか、ヒープ内のオブジェクトなのかを判断しますか?