1

ステートメントのために

rs.getString("name")  //rs is java.sql.ResultSet interface

バイトコードは次のとおりです。

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

45行目で、返された文字列オブジェクトbyrs.getString("name")がスタックにプッシュされ、50行目で、戻りオブジェクト(文字列オブジェクト)がポップアップ表示されます。

1)スタックには、ヒープ上の実際のオブジェクトを含むこの返された文字列オブジェクトへの参照のみが含まれていますか、それともスタックには実際の文字列オブジェクトが含まれていますか?

2)返された文字列オブジェクトをポップアップした後、ガベージコレクションされるのでしょうか、それともこのメソッドのスタックとしてメモリの割り当てが解除されるのでしょうか?

4

3 に答える 3

3

45行目で、rs.getString( "name")によって返された文字列オブジェクトがスタックにプッシュされます

返される文字列オブジェクトはありませ。返された文字列参照があります。

少なくとも概念的には、オブジェクトがスタックに存在したり、返されたり、渡されたりすることはありません。これは単なる参照です。

返された文字列オブジェクトをポップアップした後、ガベージコレクションされるのでしょうか、それともこのメソッドのスタックがなくなるとメモリの割り当てが解除されるのでしょうか。

スタックがポップすると、参照はクリアされます。つまり、文字列オブジェクトへの強力な参照が他にない場合、文字列オブジェクト自体がガベージコレクションの対象になります。

于 2012-11-10T12:05:55.547 に答える
1

1)スタックにはオブジェクトへの参照のみが含まれます。すべてのオブジェクトはヒープに格納されます。

2)文字列へのアクティブな参照がない場合、文字列のストレージはガベージコレクションされる可能性があります。これは、スタックからポップされたかどうかとは無関係です。これは、プログラム全体でのその文字列への参照に関するものです。

于 2012-11-10T12:06:17.747 に答える
1
  1. スタックには、文字列自体ではなく、文字列への参照があります。

  2. 文字列を割り当てていないため、ResultSetの行への参照がGCされたときに値がGCされます。

于 2012-11-10T12:07:02.483 に答える