Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java字符串在堆上分配内存?_Java_String_Memory_Heap Memory - Fatal编程技术网

为什么Java字符串在堆上分配内存?

为什么Java字符串在堆上分配内存?,java,string,memory,heap-memory,Java,String,Memory,Heap Memory,在Java中,为什么String数据类型在堆上分配内存?原因很简单,所有对象都存储在堆上。它就是这样设计的。String是一个类,它的对象将存储在堆上 还要注意,String文本以前存储在一个称为“permgen”堆的堆中。现在根据JVM规范,存储字符串文本的区域位于运行时常量池中 只有基元数据类型存储在堆栈上 java运行时使用堆内存为对象和对象分配内存 JRE类。每当我们创建任何对象时,它总是在 堆空间。垃圾收集在堆内存上运行以释放 没有任何引用的对象使用的内存。任何物体 在堆空间中创建的具

在Java中,为什么
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[]
,即使您不直接创建任何对象,这也不少见


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

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

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

那个代码块演示的是什么?你还期望发生什么?那个代码块演示的是什么?你还期望发生什么?