在Java中,为什么String
数据类型在堆上分配了内存?
答案 0 :(得分:2)
原因很简单,所有对象都存储在堆上。它是这样设计的。 String是一个类,它的对象将存储在堆上。
另请注意,String
文字先前存储在称为“permgen”堆的堆中。现在根据JVM规范,存储字符串文字的区域位于运行时常量池中。
只有原始数据类型存储在堆栈上。
的一个好处Java运行时使用堆内存为Object和。分配内存 JRE课程。每当我们创建任何对象时,它总是在 堆空间。垃圾收集在堆内存上运行以释放 没有任何引用的对象使用的内存。任何对象 在堆空间中创建的具有全局访问权限,可以从中引用 应用程序的任何地方。
区域:HotSpot
概要:在JDK 7中,不再使用实习字符串 在Java堆的永久代中分配,但是 而是分配在Java堆的主要部分(称为 年轻和老一代),以及由其创建的其他对象 应用程序。此更改将导致更多数据驻留在 主Java堆,永久生成中的数据较少,因此 可能需要调整堆大小。大多数应用程序只会看到 由于这种变化,堆使用的差异相对较小,但是 加载许多类或大量使用的大型应用程序 String.intern()方法将看到更显着的差异。 RFE: 6962931
答案 1 :(得分:0)
java中的字符串是不可变的,因此在创建它们后不能更改它们。字符串文字存储在堆中的池中,以便在尝试创建具有相同字符串文字的另一个字符串时。 java不会创建另一个字符串,它将使用池中的字符串。
String a = "bla";
String b = "bla";
字符串文字“bla”将在池中创建一次。
答案 2 :(得分:0)
默认情况下,所有对象都在堆上。 String有两个对象,它包含String
和char[]
。即使您没有直接创建任何对象,通过类型找到最多的对象并不罕见。
令人惊讶的是,它并不总是在堆上创建对象,但它可以通过转义分析将对象放在堆栈上。注意:它不能为String文字执行此操作,因为它们存储在String文本池中。
答案 3 :(得分:0)
当用户输入字符串时,每次执行时字符串大小的动态总是动态变化,因此编译器不知道字符串所需的确切内存要求。即使在运行时,在用户输入完整字符串之前也不会预测字符串的大小,因此不能在堆栈上分配内存,因此,它通常在堆栈上存储指向字符串的指针(在堆上) )。