黑马JVM总结(九)

(1)StringTable_调优1

我们知道StringTable底层是一个哈希表,哈希表的性能是跟它的大小相关的,如果哈希表这个桶的个数比较多,元素相对分散,哈希碰撞的几率就会减少,查找的速度较快,反之桶的个数较少,碰撞的几率增高,导致我的链表较长,查找的效率受到影响

调优呢主要是调整HashTable桶的个数:

时间还是挺快的0.4秒

提前设置了参数-XX:StringTableSize=200000

StaringTable的统计信息 桶个数调整到20000w,48w个单词平均分散到20w桶里面平均每个桶2个

单词,读取的效率较快的

如果去掉参数:时间会变长,默认桶大小6w个

调的更小一些:

再次运行时间变得更慢:达到12秒:因为他往StringTabel里面放一个字符串,它就要去哈希表里面查看有没有这个字符串,有的话不放

如果你的系统里你的字符串常量的个数非常的多,可以适当的把StringTable桶的个数调大,这样呢它会有一个更好的哈希分布,减少哈希冲突,让我们的StringTable串池的效率得到明显的提升

(2)StringTable_调优2

我们为什么要用StringTable呢?什么情况下用到呢?

比如说一个社交网站,他要存储大量的用户信息,用户的地址信息,用户量非常大,用户 的地址呢用字符串表示的,比如说需要用到30G的内存才能存下这些地址信息,但是用户的地址很多都是重复的,重复的地址都存入内存,占用的内存上限了30G,用这个解决方法,字符串的intern方法,这样呢可以取出重复的地址,相同的地址呢,intern之后呢在串池中只会存储一份,这样呢就可以减少字符串对内存的占用

我们演示用大量的字符串对象被创建,入池与不入池,前后对内存的占用情况

先不如池:

打开JVisualVM,他可以查看内存的占用情况

读取文件之前:字符串的内存不太多1兆左右 char数组呢字符串对象也会大量的引用char数组表示的

然后去控制台回车:

读取之后,再观看数组的占用情况:发现内存急剧增加达到差不多300兆

修改代码加入串池:加入串池后返回加入串池的对象,串池外没有加入的就会被垃圾回收

运行完之后,他们的才占30%不到40兆

跟上面的差距还是很明显的,通过入池,字符串占用内存明显减少

如果你的系统里有大量的字符串,这些字符串可能存在重复的问题,那么我们可以把字符串入池,来减少字符串的个数

(3)直接内存

直接内存并不属于java虚拟机的内存,而是属于系统内存,是操作系统的内存

直接内存,用于NIO数据读写时的缓冲区内存,NIO有一个叫ByteBuffer所使用的内存就是直接内存

属于操作系统内存分配回收成本较高但是读写性能高

ByteBuffer用的时间少,在读写大文件的时候性能高呢?

相关推荐
我不想当小卡拉米9 小时前
C++:继承+菱形虚拟继承的一箭双雕
开发语言·jvm·c++
时光呢10 小时前
JAVA常见的 JVM 参数及其典型默认值
java·开发语言·jvm
Fantasydg11 小时前
DAY 35 leetcode 202--哈希表.快乐数
算法·leetcode·散列表
我命由我1234515 小时前
Spring Boot 自定义日志打印(日志级别、logback-spring.xml 文件、自定义日志打印解读)
java·开发语言·jvm·spring boot·spring·java-ee·logback
xyliiiiiL20 小时前
ZGC初步了解
java·jvm·算法
爱的叹息20 小时前
RedisTemplate 的 6 个可配置序列化器属性对比
算法·哈希算法
心灵Haven1 天前
JVM介绍
jvm
小样vvv1 天前
【面试篇】JVM
jvm·面试·职场和发展
兢兢业业的小白鼠1 天前
Java高级JVM知识点记录,内存结构,垃圾回收,类文件结构,类加载器
java·开发语言·jvm·tomcat
程序猿chen1 天前
《JVM考古现场(十五):熵火燎原——从量子递归到热寂晶壁的代码涅槃》
java·jvm·git·后端·java-ee·区块链·量子计算