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

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

  • 这是否意味着年轻一代和老一代都有这种字符串民意调查?

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

  • 所以JVM必须在年轻和老一代中搜索String并返回对approriate字符串实例的引用。 我的想法是否正确?

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

这与垃圾收集器的代管理正交。 实际上,一些收集器有两代以上, G1(发音为“垃圾优先”)收集器可以使用多个区域用于新旧对象。 查找字符串时,JVM只是执行哈希表查找并遵循一些引用/指针,而不是像您建议的那样在每个生成/区域中单独搜索。