虚拟主机销售系统,网站优化软件排名,sem和seo的关系,宁波建设局网站首页#xff08;1#xff09;StringTable_调优1
我们知道StringTable底层是一个哈希表#xff0c;哈希表的性能是跟它的大小相关的#xff0c;如果哈希表这个桶的个数比较多#xff0c;元素相对分散#xff0c;哈希碰撞的几率就会减少#xff0c;查找的速度较快#xff0c…1StringTable_调优1
我们知道StringTable底层是一个哈希表哈希表的性能是跟它的大小相关的如果哈希表这个桶的个数比较多元素相对分散哈希碰撞的几率就会减少查找的速度较快反之桶的个数较少碰撞的几率增高导致我的链表较长查找的效率受到影响
调优呢主要是调整HashTable桶的个数 时间还是挺快的0.4秒 提前设置了参数-XX:StringTableSize200000
StaringTable的统计信息 桶个数调整到20000w48w个单词平均分散到20w桶里面平均每个桶2个
单词读取的效率较快的 如果去掉参数时间会变长默认桶大小6w个 调的更小一些 再次运行时间变得更慢达到12秒因为他往StringTabel里面放一个字符串它就要去哈希表里面查看有没有这个字符串有的话不放 如果你的系统里你的字符串常量的个数非常的多可以适当的把StringTable桶的个数调大这样呢它会有一个更好的哈希分布减少哈希冲突让我们的StringTable串池的效率得到明显的提升 2StringTable_调优2
我们为什么要用StringTable呢什么情况下用到呢
比如说一个社交网站他要存储大量的用户信息用户的地址信息用户量非常大用户 的地址呢用字符串表示的比如说需要用到30G的内存才能存下这些地址信息但是用户的地址很多都是重复的重复的地址都存入内存占用的内存上限了30G用这个解决方法字符串的intern方法这样呢可以取出重复的地址相同的地址呢intern之后呢在串池中只会存储一份这样呢就可以减少字符串对内存的占用
我们演示用大量的字符串对象被创建入池与不入池前后对内存的占用情况
先不如池 打开JVisualVM他可以查看内存的占用情况 读取文件之前字符串的内存不太多1兆左右 char数组呢字符串对象也会大量的引用char数组表示的 然后去控制台回车
读取之后再观看数组的占用情况发现内存急剧增加达到差不多300兆 修改代码加入串池加入串池后返回加入串池的对象串池外没有加入的就会被垃圾回收 运行完之后他们的才占30%不到40兆 跟上面的差距还是很明显的通过入池字符串占用内存明显减少
如果你的系统里有大量的字符串这些字符串可能存在重复的问题那么我们可以把字符串入池来减少字符串的个数
3直接内存
直接内存并不属于java虚拟机的内存而是属于系统内存是操作系统的内存 直接内存用于NIO数据读写时的缓冲区内存NIO有一个叫ByteBuffer所使用的内存就是直接内存
属于操作系统内存分配回收成本较高但是读写性能高 ByteBuffer用的时间少在读写大文件的时候性能高呢