Java 6和Java 7中的字符串文字的垃圾收集(Oracle Jdk)

Ama*_*ora 11 java string garbage-collection

根据著名本书深入浅出Java页面661:

" Garbage Collector doesn't go inside String pool."

在阅读了关于SO的类似问题后,我发现了如下混合答案:

  1. 字符串文字的垃圾收集与普通对象相同. 读这个
  2. 一些答案反过来说.在这里阅读答案.

我的问题是:

  1. 如何在Java 6及之前收集字符串文字垃圾?

  2. 因为在Java 7中,将在堆上创建字符串文字,与Java 6相比,Java 7中字符串文字的垃圾收集将如何不同?

Ani*_*kur 6

字符串文字是实习的.从Java 7开始,H​​otSpot JVM将实际的字符串放入堆中,而不是permgen.

在java 7之前,hotspot将perings中的字符串放入.然而,在permgen实习的字符串被垃圾收集.显然,permgen中的Class对象也是可收集的,因此permgen中的所有内容都是可收集的,但在某些旧JVM中默认情况下可能不会启用permgen集合.

被实习的字符串文字将是由实体池中的String对象声明的Class对象所持有的引用.因此,只有在收集了引用它的Class对象时才会收集实习文字字符串.

摘自:( 来源).