コードの 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");
インターンされた文字列ではないと思うので、間違いなく永久世代のメモリ領域にはありませんか??