为什么Java Strings在堆上分配内存?

时间:2015-05-28 17:15:10

标签: java string memory heap-memory

在Java中,为什么String数据类型在堆上分配了内存?

4 个答案:

答案 0 :(得分:2)

原因很简单,所有对象都存储在堆上。它是这样设计的。 String是一个类,它的对象将存储在堆上。

另请注意,String文字先前存储在称为“permgen”堆的堆中。现在根据JVM规范,存储字符串文字的区域位于运行时常量池中。

只有原始数据类型存储在堆栈上。

  

Java运行时使用堆内存为Object和。分配内存   JRE课程。每当我们创建任何对象时,它总是在   堆空间。垃圾收集在堆内存上运行以释放   没有任何引用的对象使用的内存。任何对象   在堆空间中创建的具有全局访问权限,可以从中引用   应用程序的任何地方。

quote from the JDK7

的一个好处
  

区域:HotSpot

     

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

答案 1 :(得分:0)

java中的字符串是不可变的,因此在创建它们后不能更改它们。字符串文字存储在堆中的池中,以便在尝试创建具有相同字符串文字的另一个字符串时。 java不会创建另一个字符串,它将使用池中的字符串。

String a = "bla";
String b = "bla";

字符串文字“bla”将在池中创建一次。

答案 2 :(得分:0)

默认情况下,所有对象都在堆上。 String有两个对象,它包含Stringchar[]。即使您没有直接创建任何对象,通过类型找到最多的对象并不罕见。

令人惊讶的是,它并不总是在堆上创建对象,但它可以通过转义分析将对象放在堆栈上。注意:它不能为String文字执行此操作,因为它们存储在String文本池中。

答案 3 :(得分:0)

当用户输入字符串时,每次执行时字符串大小的动态总是动态变化,因此编译器不知道字符串所需的确切内存要求。即使在运行时,在用户输入完整字符串之前也不会预测字符串的大小,因此不能在堆栈上分配内存,因此,它通常在堆栈上存储指向字符串的指针(在堆上) )。