Java字符串常量池详解 解析Java字符串常量池(2)
Java字符串常量池详解

Java 虚拟机创建了一个字符串对象 “Hello”,它被添加到了字符串常量池中,同时引用变量 str 存储在栈上,它指向字符串常量池中的字符串对象 “Hello”。这样就省了一步,比之前高效了。
3. 举例说明
String str = new String("Hello");
String str1 = new String("Hello");
思考:上面例子创建了几个对象
创建三个对象,首先在
字符串常量池创建一个,其次堆上创建两个
String str = new String("springIT袋网");
String str1 = new String("springIT袋网");
思考:双引号创建字符串创建几个对象
创建一个对象,就是字符串常量中的那个对象,这样就提高了性能
4. 字符串常量池在内存中位置
小念又问,哥,字符串常量池在内存中的什么位置呢?
我说,你这个问题问得好
分为三个时间段
Java7之前
在Java 7之前,字符串常量池位于永久代(Permanent Generation)中,而普通的字符串对象则存储在Java堆(Java Heap)中。
字符串常量池用于存储静态数据,包括字符串常量,而堆用于存储对象实例和数组。

当我们创建一个字符串常量时,它会被储存在永久代的字符串常量池中。
如果我们创建一个普通字符串对象,则它将被储存在堆中。
如果字符串对象的内容是一个已经存在于字符串常量池中的字符串常量,那么这个对象会指向已经存在的字符串常量,而不是重新创建一个新的字符串对象
Java7
需要注意的是,永久代的大小是有限的,并且很难准确地确定一个应用程序需要多少永久代空间。
如果我们在应用程序中使用了大量的类、方法、常量等静态数据,就有可能导致永久代空间不足。
这种情况下,JVM 就会抛出 OutOfMemoryError 错误
Java 7 开始,为了解决永久代空间不足的问题,将字符串常量池从永久代中移动到堆中。这个改变也是为了更好地支持动态语言的运行时特性。

Java 8
在Java 8中,永久代(PermGen)被取消,取而代之的是元空间(Metaspace)。
元空间是一块本机内存区域,与JVM内存区域分开。
它承担了存储类信息、方法信息、常量池信息等静态数据的功能,与永久代的作用相似。

与永久代不同的是,元空间具有一些优点:
- 动态调整大小:元空间的大小可以动态调整,这意味着不会因为元空间的大小限制而导致OutOfMemoryError错误。
- 使用本机内存:元空间使用本机内存而不是JVM堆内存,这有助于避免堆内存的碎片化问题,提高了内存利用率。
- 垃圾收集与堆分离:元空间中的垃圾收集与堆中的垃圾收集是分离的。这意味着在应用程序运行过程中进行类加载和卸载时,不会频繁触发Full GC,从而减少了系统资源的消耗。
总的来说,Java 8中的元空间相较于永久代带来了更好的性能和更可靠的内存管理。
上述就是Java字符串常量池详解的详细方法介绍,大家作为一个参考建议。
相关阅读
-
如何处理服务器网络连接不稳定? 服务器网络不稳定有哪些原因
全面为您解析如何处理服务器网络连接不稳定的话题,请看下面详细的介绍。 服务器网络连接是通过硬件和软件系统实现的,当它出现连接不稳定的问题时,这其中可能存在有多种原因。 为了
-
Smali反汇编语言数据类型及方法
为网友解答Smali反汇编语言数据类型及方法IT技巧方面的经验,如有不对的地方欢迎指正! Smali介绍 Smali是一种用于Android应用程序的反汇编语言,它将Android应用程序的Dalvik字节码转换为易于阅
-
网站建设需要多少费用 搭建网站的费用标准
跟大家聊一聊网站建设需要多少费用和搭建网站的费用标准的介绍,一起跟随小编看看吧! 随着现代社会的发展,制作网站的门槛是越来越低,现在有开源的程序,会打字就可以建设一个网站
-
redis哈希槽为什么是16384
您可能不了解redis哈希槽为什么是16384的IT知识,具体内容如下: 我们知道一致性哈希算法是对2的32次方取模,而哈希槽是对2的14次方取模 ✏️ Redis作者认为这样做不太值得;并且一般情况下一


