原因很简单,所有对象都存储在堆上。它是这样设计的。String 是一个类,它的对象将存储在堆中。
另请注意,String文字先前存储在称为“permgen”堆的堆中。现在根据 JVM 规范,存储字符串文字的区域在运行时常量池中。
只有原始数据类型存储在堆栈中。
Java 运行时使用堆内存为对象和 JRE 类分配内存。每当我们创建任何对象时,它总是在堆空间中创建。垃圾收集在堆内存上运行以释放没有任何引用的对象使用的内存。在堆空间中创建的任何对象都具有全局访问权限,并且可以从应用程序的任何地方引用。
引用 JDK7 的一个好点
区域:热点
概要:在 JDK 7 中,interned 字符串不再分配在 Java 堆的永久代中,而是分配在 Java 堆的主要部分(称为年轻代和年老代)中,以及其他创建的对象应用程序。此更改将导致更多数据驻留在主 Java 堆中,而永久代中的数据更少,因此可能需要调整堆大小。由于这种变化,大多数应用程序只会看到相对较小的堆使用差异,但加载许多类或大量使用 String.intern() 方法的较大应用程序将看到更显着的差异。RFE:6962931