拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Java的字符串常量池位于哪里,堆或堆栈在哪里?

Java的字符串常量池位于哪里,堆或堆栈在哪里?

白鹭 - 2021-11-24 364 0 0

1.简介

每当我们声明一个变量或创建一个对象时,它就会存储在内存中。在较高的级别上,Java将内存分为两个块:堆栈和堆。两种存储器均存储特定类型的数据,并且具有不同的存储和访问模式。

在本教程中,我们将研究不同的参数,并了解哪个是最适合存储String常量池的区域。

2.字符串常量池

String常量池是一个特殊的存储区。当我们声明String文字时,JVM在池中创建对象并将其引用存储在堆栈中。在内存中创建每个String对象之前,JVM执行一些步骤来减少内存开销。

字符串常量池在其实现中Hashmap Hashmap每个存储桶均包含具有相同哈希码String在Java的早期版本中,池的存储区域是固定大小的,并且通常会导致“Could not reserve enough space for object heap”错误。

当系统加载类时, String文字都将进入应用程序级池。这是因为String文字必须是相同的Object 。在这些情况下,池中的数据应可用于每个类而没有任何依赖关系。

通常,栈stack存储短期的数据。它包括局部基本变量,堆对象的引用以及执行中的方法。堆允许动态分配内存,在运行时存储Java对象和JRE类。

堆heap允许全局访问,并且在应用程序的生存期内,堆中的数据存储可用于所有线程,而堆栈上的数据存储具有私有作用域,只有所有者线程可以访问它们。

栈stack将数据存储在连续的存储块中,并允许随机访问。如果类需要String ,则由于堆栈的LIFO(后进先出)规则,该类可能不可用。相反,堆heap会动态分配内存,并允许我们以任何方式访问数据。

假设我们有一个由不同类型的变量组成的代码段。堆栈将存储int文字String和Demo对象的.任何对象的值都将存储在堆中,所有String文字都放入堆中的池中:

Java的字符串常量池位于哪里,堆或堆栈在哪里?

线程完成执行后,将立即释放在堆栈上创建的变量。相反,垃圾收集器回收堆中的资源。同样,垃圾收集器从池中收集未引用的项目。

池的默认大小在不同平台上可能会有所不同。无论如何,它仍然比可用堆栈大小大得多。在JDK 7之前,该池是permgen空间的一部分,从JDK 7到现在,它是主堆内存的一部分。

3.结论

在这篇简短的文章中,我们了解了String常量池的存储区域。栈和堆具有不同的特性来存储和访问数据。从内存分配到其访问和可用性,堆是最适合存储String常量池的区域。

实际上,常量从未成为栈stack内存的一部分。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *