2012-11-10 68 views
1

for语句Java堆栈和对象

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)并弹出返回的字符串对象后,它会被垃圾收集或它的内存释放为堆栈,这种方法消失???

回答

3

在管线45由rs.getString( “名称”)返回字符串对象被压入堆栈

没有返回字符串对象。有一个返回的字符串参考

从概念上讲,至少,对象永远不会在堆栈上,永远不会返回,永远不会传递。这只是有史以来一个参考。

并弹出返回的字符串对象后,它会被垃圾回收或它的内存释放为堆栈为此方法消失?

参考将被清除时弹出堆栈,这意味着如果有到它没有其它强引用的字符串对象本身将有资格进行垃圾回收。

1

1)堆栈只包含对象的引用。所有对象都存储在堆中。

2)字符串的存储空间可能是,如果没有对其进行活动引用,则会被垃圾回收。这与它是否弹出堆栈无关。这是关于整个程序中对该字符串的引用。

1
  1. 堆栈有一个对字符串的引用,而不是字符串本身。

  2. 由于您没有分配字符串,因此当对ResultSet中的行的引用是GCed时,该值将被GCed。