实习一个字符串

IUn*_*own 1 java jvm memory-management

当我们实习字符串时,我们确保该字符串的所有使用都指向同一个实例.

我假设底层字符串对象在堆中.

但是,引用变量存储在内存中的哪个位置?

它是否具有与以下相同的行为static- 其中引用存储在permgen中并且仅在类加载器(和应用程序)退出后才使字符串实例可用于gc?

マルち*_* だよ 5

直到JDK 6,Intern'ed字符串存储在内存池中的一个名为Permanent Generation的地方,这是JVM的一个区域,为非用户对象保留,如Classes,Methods和其他内部JVM对象.该区域的大小有限,通常比堆小得多.

从JDK 7开始,实现的字符串不再分配在Java堆的永久生成中,而是分配在Java堆的主要部分(称为年轻代和旧代)以及应用程序创建的其他对象中. .此更改将导致更多数据驻留在主Java堆中,并且永久生成中的数据更少,因此可能需要调整堆大小.由于此更改,大多数应用程序将只看到堆使用中的相对较小的差异,但是加载许多类或大量使用String.intern()方法的较大应用程序将看到更显着的差异.

在这个答案中可以找到对此的详细解释.