字符串池存在于年轻一代和老一代?

时间:2013-12-18 05:06:59

标签: java string garbage-collection heap

从Java 7中获取的字符串不再存储在permgen区域。相反,它们存储在正常的堆空间中,这意味着它们必须经历一半的GC和完整的GC。现在在半个GC之后,那些生存下来的实习生必须从年轻一代转移到老一代。

  • 这是否意味着年轻一代和老一代都有此字符串投票?

接下来让我们说一个字符串。我们定义了一个具有相同内容的字符串文字,然后在这种情况下,它必须指向池中相同的字符串内容。

  • 因此JVM必须在年轻一代和老一代中搜索String 并返回对approriate字符串实例的引用。是我的 思考正确吗?

1 个答案:

答案 0 :(得分:2)

您将实习生表的逻辑布局与其在内存中的物理排列混淆。实习表只是一个链接冲突的哈希表,逻辑上(虽然不是物理上)类似于HashMap。在实际执行字符串时,JVM会对其进行哈希处理,然后查找相应的存储桶并返回它找到的字符串或将新字符串添加到存储桶中。

这与垃圾收集器的代管理正交。实际上,一些收藏家有两代以上,而G1 (pronounced "garbage first") collector可以将多个区域用于新旧对象。查找字符串时,JVM只是执行哈希表查找并遵循一些引用/指针,而不是像你建议的那样在每个代/区域中单独搜索。