【问题标题】:java stack and object returned by a methodjava堆栈和方法返回的对象
【发布时间】:2012-11-10 12:02:59
【问题描述】:

for 语句

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

【问题讨论】:

    标签: java garbage-collection


    【解决方案1】:

    在第 45 行,rs.getString("name") 返回的字符串对象被压入堆栈

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

    至少在概念上,对象永远不会在堆栈上,永远不会返回,永远不会传递。它只是曾经一个参考。

    并且在弹出返回的字符串对象后,它会被垃圾回收还是被释放的内存作为该方法的堆栈消失?

    引用会在堆栈弹出时被清除,这意味着如果没有其他强引用,字符串对象本身就有资格进行垃圾回收。

    【讨论】:

      【解决方案2】:

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

      2) 字符串的存储可能在没有对它的活动引用时被垃圾回收。这与它是否从堆栈中弹出无关。这是关于在整个程序中对该字符串的引用。

      【讨论】:

        【解决方案3】:
        1. 堆栈有对字符串的引用,而不是字符串本身。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-01-30
          • 2020-10-27
          • 2023-04-01
          • 2011-11-25
          • 1970-01-01
          • 2020-07-28
          • 2011-12-01
          • 2021-01-19
          相关资源
          最近更新 更多