黑马JVM总结(九)

2023-09-15 23:31:32

(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用的时间少,在读写大文件的时候性能高呢?

更多推荐

Linux知识点 -- HTTPS协议

Linux知识点–HTTPS协议文章目录Linux知识点--HTTPS协议一、概念1.HTTPS协议2.加密3.运营商劫持4.常见的加密方式4.数据摘要&&数字指纹5.数字签名二、HTTPS的工作过程探究1.方案一:只用对称加密2.方案二:只使用非对称加密3.方案三:双方都使用非对称加密4.方案四:非对称加密+对称加密

接口隔离原则~

接口隔离原则是面向对象设计原则中的一条原则,它的核心思想是将大接口拆分为多个小接口,客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上,接口应该具有单一功能,不应该包含不相关或不需要的方法,以便提高系统的灵活性和可维护性。它同时也要求接口的设计应该稳定,一旦设计好后,就不应该频繁地进行修改。

构建可维护的大规模应用:框架架构的最佳实践

文章目录框架架构的重要性最佳实践1.模块化设计2.遵循SOLID原则3.使用设计模式4.异常处理5.代码注释和文档6.测试SpringBoot和Django:关键框架示例SpringBoot(Java)模块化设计:SOLID原则:设计模式:依赖注入和工厂模式:异常处理:代码注释和文档:测试:Django(Python)

【无公网IP】Windows搭建 WebDAV服务,并内网穿透公网访问

文章目录1.安装IIS必要WebDav组件2.客户端测试3.cpolar内网穿透3.1打开Web-UI管理界面3.2创建隧道3.3查看在线隧道列表3.4浏览器访问测试4.安装Raidrive客户端4.1连接WebDav服务器4.2连接成功4.2连接成功总结自己用WindowsServer搭建了家用NAS主机,WebDA

C- 使用exit()的优点

使用exit函数有很多优点,特别是在大型程序和系统中。我们来逐一分析这些优点:可以从其他函数中调用:在C语言和许多其他编程语言中,exit是一个库函数,通常在stdlib.h(C)或cstdlib(C++)头文件中定义。这个函数的主要功能是终止程序的执行并返回一个状态码到调用进程(通常是操作系统或shell)。由于ex

用Win10自带画图3D抠图

文章目录一、打开“画图3D”二、插入图片三、抠图操作四、保存抠图一、打开“画图3D”在搜索框输入“画图3D”选择彩色水滴图标的软件二、插入图片选择“新建”导航栏“菜单”–>“插入”,选择要扣的图片。(我选择了一张自己随意画的图片)三、抠图操作选择导航栏的“神奇选择”选择“下一步”因为我的图片非常规整,所以自动选中了圆形

SpringAOP

AOP实现原理SpringAOP基于动态代理实现原理:○如果被代理的对象,已经实现某个接口,则SpringAOP会使用JDKProxy(反射),基于接口的方式,创建代理对象(JDK动态代理的核心是InvocationHandler接口和Proxy类);○如果被代理的对象,没有实现某个接口,就无法使用JDKProxy去进

Linux日期和时间管理指南:日期、时间、时区、定时任务和时间同步

文章目录Linux日期和时间管理指南1.简介1.1Linux日期和时间的重要性1.2日期管理的需求2.查看当前日期和时间2.1date命令2.2cal命令2.3查看硬件时钟3.设置系统日期和时间3.1设置日期3.2设置时间3.3设置硬件时钟4.时区管理4.1查看当前时区4.2修改系统时区4.3多时区设置5.定时任务和计

【数据结构】二叉树

🔥博客主页:小王又困了📚系列专栏:数据结构🌟人之为学,不日近则日退❤️感谢大家点赞👍收藏⭐评论✍️目录一、树概念及结构1.1树的概念1.2树的相关概念1.3树的表示二、二叉树概念及结构2.1二叉树的概念2.2特殊的二叉树2.3二叉树的存储结构🗒️前言:在前面我们学习了顺序表、链表等数据结构,这些都是线性表,是

Unity中 UI Shader的基本功能

文章目录前言一、实现思路1、暴露一个2D类型的属性来接受UI的纹理2、设置shader的层级为TransParent半透明渲染层级,一般UI都是在这个渲染层级3、更改混合模式,是UI使用的纹理,该透明的地方透明二、代码实现前言Unity中UIShader的基本功能一、实现思路1、暴露一个2D类型的属性来接受UI的纹理/

mysql内连接与外连接详解

内连接与外连接内连接外连接在数据库中,连接操作是一种把两个或者多个表的记录组合在一起的操作,常用的有内连接(InnerJoin)、外连接(OuterJoin)等。内连接内连接(InnerJoin):内连接是最常用的连接操作,它只返回两个表中满足连接条件的记录。在Java中,可以使用SQL语句中的INNERJOIN关键字

热文推荐