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


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

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

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

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

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

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

点赞