其他分享
首页 > 其他分享> > 【JVM Ⅳ】StringTable字符串表

【JVM Ⅳ】StringTable字符串表

作者:互联网

一、String 的基本特性:

String 的不可变性

【基本特性】final修饰、实现Serialize跨进程、Comparable可比较用作排序;
【解释】不可变的字符序列,它是存储在堆区的常量池中的(两种办法:""、intern()都可以。)
【变化】JDK1.8char型数组存储,1.9之后使用的是byte型数组存储。

String的底层Hashtable结构

【解释】字符串常量池中是不会存储相同内容的字符串的,字符串数组和链表的博弈,StringTablSize 。

cmd查看参数:

jps查看Java Virtual Machine Process Status Tool,查看虚拟机进程

option:
jinfo -flag StringTableSize 进程id

在这里插入图片描述

二、String内存分配

放在堆中,

String内存结构的分配位置

【变化】1.6字符串常量在永久代:极少GC导致OOM更易出现;1.7字符串常量池放在堆中,调优的时候只需要改变堆的大小。

三、字符串基本操作

字符串常量池

码点序列一致就不需要重新加载String实例。

四、字符串拼接操作

底层原理:

拼接操作和append进行对比

拼接操作的效率更低,因为涉及到两个操作:new StringBuilder和底层的toString下的new String对象。占用的内存也更多,GC更加频繁。
append只有本身的一个对象。

五、intern()

把对象放入字符串常量池的方法:有的直接拿,没有直接加载新的

String的intern方法使用:

本不存在就给引用或者""对象。

在这里插入图片描述

大的网站平台,需要内存中存储大量的字符串。字符串都调用 intern() 方法,就会明显降低内存的大小。

intern方法的实现

    public static void main(String[] args) throws InterruptedException {
        String s1 = new String("a") + new String("b");
        String s2 = "ab";
        String s3 = new String("ab");
//        s3 =等价于= s1+s2
    }

六、G1的String去重操作

干掉new 出来的重复String对象!

标签:String,对象,StringTable,拼接,JVM,字符串,new,常量
来源: https://blog.csdn.net/weixin_43801418/article/details/117882568