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 行,返回的字符串对象rs.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 中的行的引用被 GCed 时,该值将被 GCed。

于 2012-11-10T12:07:02.483 回答