JVM参数:-XX:StringTableSize
2017-07-14 18:57
190 查看
通过笨神的分享整理笔记:
常量池底层使用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很高 就是这个问题
常量池底层使用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很高 就是这个问题
相关文章推荐
- 你假笨JVM参数 - 002 StringTableSize
- JVM GC的核心参数: -XX:Newratio -XX:Newsize -XX:Maxnewsize -XX:Surviorratio
- JVM参数:-XX:ReservedCodeCacheSize
- jvm参数设置 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
- jvm参数设置 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
- Java_JVM参数-XX:MaxDirectMemorySize 与 两种 ByteBuffer: heap,direct ByteBuffer
- jvm参数设置 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
- jvm参数设置 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
- jvm参数设置 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
- jvm参数设置 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
- Java_JVM参数-XX:MaxDirectMemorySize 与 两种 ByteBuffer: heap,direct ByteBuffer
- jvm参数设置 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
- jvm参数设置 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
- jvm参数设置 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
- JVM中Xms、Xmx、PermSize、MaxPermSize等参数的区别
- Mysql调优中两个重要参数table_cache和key_buffer_size
- 给JES8 MQ的启动加JVM Heap Size参数
- tomcat 启动参数 Xms, Xmx, XX:MaxNewSize, XX:PermSize, -XX:MaxPermSize, Djava.awt.headless
- JVM实用参数(一)打印所有XX参数及值
- linux下JVM参数-XX:+HeapDumpOnOutOfMemoryError 设置