表示声明
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)堆栈是否只包含引用到这个返回的字符串对象,堆上的实际对象或堆栈包含实际的String对象??
2)并且在弹出返回的字符串对象之后,它是否会被垃圾收集,或者它的内存被释放为堆栈,因为此方法消失了???
答案 0 :(得分:3)
在第45行,rs.getString(“name”)返回的字符串对象被压入堆栈
没有返回的字符串对象。有一个返回的字符串引用。
至少在概念上, objects 永远不会在堆栈上,永远不会返回,永远不会传递。它只是永远一个参考。
并且在弹出返回的字符串对象之后,它会被垃圾收集还是内存被释放,因为此方法的堆栈会消失?
当堆栈弹出时,引用将被清除,这意味着如果没有其他强引用,则字符串对象本身将有资格进行垃圾回收。
答案 1 :(得分:1)
1)堆栈仅包含对象的引用。所有对象都存储在堆上。
2)当没有活动引用时,字符串的存储可能被垃圾收集。这与它是否从堆栈中弹出是独立的。这是关于整个程序中对该字符串的引用。
答案 2 :(得分:1)
堆栈有对字符串的引用,而不是字符串本身。
由于您没有分配String,因此当对ResultSet中的行的引用为GC时,该值将被GC。