JVM参数:-XX:StringTableSize

xiaoxiao2021-02-28  9

通过笨神的分享整理笔记: 常量池底层使用StringTable数据结构保存字符串引用,实现和HashMap类似,根据字符串的hashcode定位到对应的数组,遍历链表查找字符串,当字符串比较多时,会降低查询效率。 -XX:StringTableSize 在我们调用String.intern的时候会往hashtable里插入一项,这个table就是stringtable 使用最多的场景是序列化反序列化场景,为了避免同一个字符串被多次创建,保证每次通过string的intern返回的是同一个字符对象。 这个参数就是现在这个表的size。 如果这样参数很小,带来的问题很明显,就是hash碰撞,这样在查找字符串过程中可能会比较耗cpu 不过jdk6某个版本开始已经有了rehash的逻辑了 当冲突次数超过100次就会自动做rehash,但是表如果size小的话,那再怎么rehash也是冲突,只能换来的是不断做rehash,因此性能会比较差。 所以建议大家将这个参数设置成一个比较大的质数,减少冲突

症状的关键表现是: 通过perf才能看到 如果能看到stringtable的lookup方法占cpu很高 就是这个问题

转载请注明原文地址: https://www.6miu.com/read-200228.html

最新回复(0)