0

コードの 2 行を考えてみましょう。

...
rs.next();  //rs is ResultSet interface.
rs.getString("name");
...

javapによって生成されるバイト コードは次のとおりです。

...
35:  invokeinterface #9,  1; //InterfaceMethod java/sql/ResultSet.next:()Z
   40:  pop
   41:  aload   4
   43:  ldc     #10; //String name
   45:  invokeinterface #11,  2; //InterfaceMethod java/sql/ResultSet.getString:
(Ljava/lang/String;)Ljava/lang/String;
   50:  pop
   51:  aload_2
   52:  invokeinterface #12,  1; //InterfaceMethod java/sql/Connection.close:()V

 ...

このバイトコードを解釈しようとしています。

行のrs.getString("name");バイトコードは、43 行目から 51 行目までです。

1) 45 行目でメソッドがINVOKEDになり、Ljava/lang/String で表される文字列オブジェクトが返されます。これは正しいですか、それともここで、メソッドのみが定数プールからインデックス #11 TO STACK でロードされ、50 行目で実行されますか?? ?

rs.getString("name");2)嘘によって返された文字列オブジェクトはどこにありますか? aload_2がスタックに値をプッシュしていると思うので、スタックまたはヒープ上。

実際にここで、私は次の点で混乱しています。

私が持っていると仮定すると:

 ...
rs.next();
rs.getString("name");
rs.getString("name");
rs.getString("name");
rs.getString("name");
...10 more times...
...

すべて同じ名前を返します。次に、同じ値を持つ 10 個の異なる文字列オブジェクトが存在します。したがって、メモリが浪費され、intern() を使用するケースになります。しかし、これらがスタックにある場合でも、メモリの浪費と見なされ、intern() が必要ですか???

3) によって返される文字列オブジェクトはrs.getString("name");インターンされた文字列ではないと思うので、間違いなく永久世代のメモリ領域にはありませんか??

4

1 に答える 1

2

呼び出しのバイトコードの関連部分

rs.getString("name")

41:  aload   4
43:  ldc     #10; //String name
45:  invokeinterface #11,  2; //InterfaceMethod java/sql/ResultSet.getString:(Ljava/lang/String;)Ljava/lang/String;
50:  pop

この行を一度に1つのオペコードを取る:

41:  aload   4

ローカル変数#4(rs)に格納されているオブジェクトをスタックにプッシュします

43:  ldc     #10; //String name

文字列定数"name"をスタックにプッシュします

45:  invokeinterface #11,  2; //InterfaceMethod java/sql/ResultSet.getString:(Ljava/lang/String;)Ljava/lang/String;

上位2つの項目をスタックからポップして、インターフェイスメソッドを呼び出し、結果(a )をスタックにjava/sql/ResultSet.getString:(Ljava/lang/String;)Ljava/lang/String;プッシュします。Ljava/lang/String;

50:  pop

次に、前のメソッドの結果をスタックからポップします。

于 2012-11-10T07:46:11.077 に答える