美文网首页
String解析(二)

String解析(二)

作者: 七喜丶 | 来源:发表于2022-01-23 10:38 被阅读0次

    1.字符串常量池

    字符串的分配和其他的对象分配一样,需要耗费高昂的时间和空间为代价,如果需要大量频繁的创建字符串,会极大程度地影响程序的性能,因此 JVM 为了提高性能和减少内存开销引入了字符串常量池(Constant Pool Table)的概念

    字符串常量池相当于给字符串开辟一个常量池空间类似于缓存区,对于直接赋值的字符串(String s="xxx")来说,在每次创建字符串时优先使用已经存在字符串常量池的字符串,如果字符串常量池没有相关的字符串,会先在字符串常量池中创建该字符串,然后将引用地址返回变量,如下图所示:

    以上说法可以通过如下代码进行证明:

    public class StringExample {
        public static void main(String[] args) {
            String s1 = "Java";
            String s2 = "Java";
            System.out.println(s1 == s2);
        }
    }
    

    以上程序的执行结果为:true,说明变量 s1 和变量 s2 指向的是同一个地址

    在这里我们顺便说一下字符串常量池的再不同 JDK 版本的变化

    2.常量池的内存布局

    从JDK 1.7 之后把永生代换成的元空间,把字符串常量池从方法区移到了 Java 堆上
    JDK 1.7 内存布局如下图所示:


    JDK 1.8 内存布局如下图所示:

    JDK 1.8 与 JDK 1.7 最大的区别是 JDK 1.8 将永久代取消,并设立了元空间。官方给的说明是由于永久代内存经常不够用或发生内存泄露,会爆出 java.lang.OutOfMemoryError: PermGen 的异常,所以把将永久区废弃而改用元空间了,改为了使用本地内存空间,官网解释详情:http://openjdk.java.net/jeps/122

    相关文章

      网友评论

          本文标题:String解析(二)

          本文链接:https://www.haomeiwen.com/subject/pglmhrtx.html