首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

String及StringTable(二):java中的StringTable

在前面部门已经涉及到了对StringTable的一些基本使用。但是或许很多人还并不知道什么是StringTable。StringTable也可称为StringPool,是jvm在1.7之后,在堆内存中分配的一块区域,用于存放常用的字符串。这点与IntegerCace类似,实际上在java中,存在很多这样的常量池。其目的只有一个,就是为了复用,节约内存。 StringTable实际上是一个固定大小的HashTable。因此被称为StringTable。其默认大小为60013。这个值是可以设置的,可以通过-XX: StringTableSize 设置这个值的大小。而最早在jdk1.6的时候这个值是固定的为1009。而在jdk1.8中1009是可设置的最小值。 实际上,这个值的变化,也可以从中看出,java应用不断大型化的过程。包括垃圾回收器,也是从CMS演化到G1,这些都是为了支持在更多的内存中进行更加复杂的业务支撑。 StringTable的长度不能像HashMap那样动态扩容。因此,如果hash冲突,那么它只能采取拉链法来解决。这就类似于一个不能扩容的1.7版本中的HashMap。那么这样带来的坏处就是,随着链表长度的增加,StringTable中检索的时间复杂度会增加。这样会造成其性能急剧下降。 虽然在1.8版本中默认长度为60013,但是如果某些特殊应用造程StringTable中链表的长度不断增加的话,势必会影响性能。 StringTable我们可以通过-XX:+PrintStringTableStatistics进行查看,这个参数会将StringTable和SymbolTable在程序执行完之后都进行print。输出如下:

03
领券