【问题标题】:String Pool exists in both young and old generation?字符串池在年轻代和老年代都存在?
【发布时间】:2014-01-06 03:41:23
【问题描述】:

从 Java 7 开始,实习字符串不再存储在 permgen 区域中。相反,它们存储在正常的堆空间中,这意味着它们必须经历半垃圾回收和全垃圾回收。现在在半 GC 之后,那些存活的实习字符串必须从年轻代转移到老年代。

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

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

  • 因此 JVM 必须在年轻代和年老代中搜索字符串 并返回对适当字符串实例的引用。是我的 想对了吗?

【问题讨论】:

    标签: java string garbage-collection heap-memory


    【解决方案1】:

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

    这与垃圾收集器的世代管理正交。确实,一些收集器有两代以上,G1 (pronounced "garbage first") collector 可以为新旧对象使用多个区域。在查找字符串时,JVM 只是进行哈希表查找并遵循一些引用/指针,而不是按照您的建议在每一代/区域中单独搜索。

    【讨论】:

      猜你喜欢
      • 2020-05-16
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多