为什么Java字符串在堆上分配内存?
在Java中,为什么为什么Java字符串在堆上分配内存?,java,string,memory,heap-memory,Java,String,Memory,Heap Memory,在Java中,为什么String数据类型在堆上分配内存?原因很简单,所有对象都存储在堆上。它就是这样设计的。String是一个类,它的对象将存储在堆上 还要注意,String文本以前存储在一个称为“permgen”堆的堆中。现在根据JVM规范,存储字符串文本的区域位于运行时常量池中 只有基元数据类型存储在堆栈上 java运行时使用堆内存为对象和对象分配内存 JRE类。每当我们创建任何对象时,它总是在 堆空间。垃圾收集在堆内存上运行以释放 没有任何引用的对象使用的内存。任何物体 在堆空间中创建的具
String
数据类型在堆上分配内存?原因很简单,所有对象都存储在堆上。它就是这样设计的。String是一个类,它的对象将存储在堆上
还要注意,String
文本以前存储在一个称为“permgen”堆的堆中。现在根据JVM规范,存储字符串文本的区域位于运行时常量池中
只有基元数据类型存储在堆栈上
java运行时使用堆内存为对象和对象分配内存
JRE类。每当我们创建任何对象时,它总是在
堆空间。垃圾收集在堆内存上运行以释放
没有任何引用的对象使用的内存。任何物体
在堆空间中创建的具有全局访问权限,可以从
应用程序的任何位置
一个很好的论点
地区:热点
简介:在JDK7中,插入的字符串不再是
在Java堆的永久生成中分配,但是
而是在Java堆的主要部分(称为
年轻人和老年人),以及由
应用程序。此更改将导致更多数据驻留在
主Java堆,永久生成的数据更少,因此
可能需要调整堆大小。大多数应用程序只能看到
由于此更改,堆使用率的差异相对较小,但是
加载许多类或大量使用
String.intern()方法将看到更显著的差异。RFE:
6962931
原因很简单,所有对象都存储在堆上。它就是这样设计的。String是一个类,它的对象将存储在堆上 还要注意,
String
文本以前存储在一个称为“permgen”堆的堆中。现在根据JVM规范,存储字符串文本的区域位于运行时常量池中
只有基元数据类型存储在堆栈上
java运行时使用堆内存为对象和对象分配内存
JRE类。每当我们创建任何对象时,它总是在
堆空间。垃圾收集在堆内存上运行以释放
没有任何引用的对象使用的内存。任何物体
在堆空间中创建的具有全局访问权限,可以从
应用程序的任何位置
一个很好的论点
地区:热点
简介:在JDK7中,插入的字符串不再是
在Java堆的永久生成中分配,但是
而是在Java堆的主要部分(称为
年轻人和老年人),以及由
应用程序。此更改将导致更多数据驻留在
主Java堆,永久生成的数据更少,因此
可能需要调整堆大小。大多数应用程序只能看到
由于此更改,堆使用率的差异相对较小,但是
加载许多类或大量使用
String.intern()方法将看到更显著的差异。RFE:
6962931
java中的字符串是不可变的,因此它们在创建后不能更改。字符串文本存储在堆中的一个池中,因此,如果您尝试使用相同的字符串文本创建另一个字符串,则。java不会创建另一个字符串,它将使用池中的字符串
String a = "bla";
String b = "bla";
字符串文本“bla”将在池中创建一次。java中的字符串是不可变的,因此在创建后不能更改。字符串文本存储在堆中的一个池中,因此,如果您尝试使用相同的字符串文本创建另一个字符串,则。java不会创建另一个字符串,它将使用池中的字符串
String a = "bla";
String b = "bla";
字符串文字“bla”将在池中创建一次。默认情况下,所有对象都在堆中。字符串有两个对象,它包装的是
字符串
和char[]
。根据类型发现最多的对象是char[]
,即使您不直接创建任何对象,这也不少见
String a = "bla";
String b = "bla";
令人惊讶的是,它并不总是在堆上创建对象,但它可以通过转义分析将对象放置在堆栈上。注意:它不能对字符串文本执行此操作,因为它们存储在字符串文本池中。默认情况下,所有对象都在堆上。字符串有两个对象,它包装的是
字符串
和char[]
。根据类型发现最多的对象是char[]
,即使您不直接创建任何对象,这也不少见
令人惊讶的是,它并不总是在堆上创建对象,但它可以通过转义分析将对象放置在堆栈上。注意:它不能对字符串文本执行此操作,因为它们存储在字符串文本池中。当用户输入字符串时,它总是动态的,即每次执行时字符串的大小可能会改变,因此编译器不知道字符串所需的确切内存需求。即使在运行时,在用户输入完整的字符串之前,也不会预测字符串的大小,因此无法在堆栈上分配内存,因此,它通常会在堆栈上存储指向字符串(在堆上)的指针。当用户输入字符串时,它总是动态的,即每次执行时字符串的大小可能会改变,因此编译器不知道字符串所需的确切内存需求。即使在运行时,在用户输入完整的字符串之前,也不会预测字符串的大小,因此无法在堆栈上分配内存,因此,它通常在堆栈上存储指向字符串的指针(在堆上).那个代码块演示的是什么?你还期望发生什么?那个代码块演示的是什么?你还期望发生什么?