StringTable(字符串常量池)性能调优

1.StringTable特性

1、常量池中的字符串仅是符号,第一次用到时才变为对象
例如 String X=“a”; 第一次用到的时候会将他存入常量池
2、利用串池的机制,来避免重复创建字符串对象
例如 String X1=“a”;第二次出现了就不会存到常量池了而是直接用
String s1=new String(“a”); new 出来的放在堆里吗,堆里的a和常量池里的a不相等
可以使用 intern 方法,主动将串池中还没有的字符串对象放入串池
JDK1.8中 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有则放入串池, 指向堆空间中的String对象并返回这个对象
而1.6也是有就用没有就存,但是是复制的,1.6的字符串常量池是在方法区中,方法区的实现方式是和堆一样的(方便垃圾回收),存放的位置在堆空间的永久代中,永久代中的对象和堆中其他空间的对象肯定是不等的
3、字符串变量拼接的原理是 StringBuilder (1.8)
4、字符串常量拼接的原理是编译期优化

String s1 = new String("a");//s1为堆内存对象
String s2 = "a";//仅在常量池中创建"a"对象
String s3 = new String("a")+new String("b");
s1为堆内存对象,由于是通过StringBuilder连接,
此时不会在常量池中创建"ab"对象,
可通过调用intern方法主动放入常量池中

2.StringTable位置

jdk1.6 StringTable 位置是在永久代中
jdk1.7、 1.8 StringTable 位置是在堆中。

在这里插入图片描述

3.StringTable垃圾回收

stringtable也会受到垃圾回收的管理,垃圾回收只会在内存紧张的时候当内存空间不足时,stringtable中那些没有被引用的字符串常量,仍然会被垃圾回收。

-Xmx10m 虚拟机堆内存的最大值
-XX:+PrintStringTableStatistics 打印字符串表的统计信息,通过他可以清楚的看到串池中字符串实例的个数,包括占用的一些大小信息
-XX:+PrintGCDetails -verbose:gc 打印垃圾回收的详细信息,如果发生垃圾回收,他就会把垃圾回收的次数、时间之类的显示出来。
stringtable底层的实现类似于hashtable的实现,即他是哈希表,哈希表是数组加链表的结构,每个数组的个数称之为桶

4.stringtable 性能调优

4.1调整 -XX:StringTableSize=桶个数

stringtable的底层是哈希表,哈希表的性能是跟她的大小密切相关的。如果哈希表的桶的个数比较多,那么相对这个元素就比较分散,那么哈希碰撞的几率就会减少,查找的速度也会变快。反之,如果桶的个数比较少,那么哈希碰撞的几率就会增高,从而查找的速度也会受到影响。调优其实就是调桶的个数。

4.2考虑将字符串对象是否入池

如果你的应用里有大量的字符串,而且这些字符串可能会存在重复的问题,那么可以让字符串入池来减少他的字符串对象个数,节约堆内存的使用。
例如:小明家住在河东小区,小刚家也在河东小区,我们要存他们的地址北京市丰台区这样就重复了,

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轩*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值