性能优化(二)

一 内存管理

  1. 内存:由可读写单元组成,表示一片可操作空间
  2. 管理:人为的去操作一片空间的申请、使用和释放
  3. 内存管理:开发者主动申请空间、使用空间、释放空间
  4. 管理流程:申请-使用-释放

二 JavaScript中的垃圾回收

  • JavaScript中内存管理是自动的
  • 对象不再被引用时是垃圾
  •  对象不能从根上访问时是垃圾

三 JavaScript的可达对象

  • 可以访问到的对象就是可达对象(引用、作用域链)
  • 可达的标准就是从根出发是否能够被找到
  • JavaScript中的根就可以理解为是全局变量对象 

四 GC算法

  1. GC定义与作用
  • GC就是垃圾回收机制的简写
  • GC可以找到内存中的垃圾、并释放和回收空间  

 2.GC算法是什么

  • GC是一种机制,垃圾回收器完成具体的工作
  • 工作的内容就是查找垃圾释放空间、回收空间
  • 算法就是工作时查找和回收所遵循的规则

 3.常见的GC算法

  • 引用计数
  • 标记清除
  • 标记整理
  • 分代回收

4. 引用计数算法原理

  • 核心思想:设置引用数,判断当前引用数是否为0
  • 引用关系改变时修改引用数字
  • 引用数字为0时立即回收

5.引用计数的优点

  • 发现垃圾立即回收
  • 最大限度减少程序暂停 

 6.引用计数的缺点

  • 无法回收循环引用的对象
  • 时间开销大

 7.标记清除算法的原理

  • 核心思想:分标记和清除二个阶段完成
  • 遍历所有对象找标记活动对象
  • 遍历所有对象清除没有标记对象
  • 回收相应的空间

8.标记清除算法的优缺点

  • 优点:解决了引用计数算法中循环引用对象无法回收的问题
  • 缺点:在空间回收的过程中会产生空间碎片化的问题,不能让空间最大化的使用 不会立即回收垃圾对象

 9.标记整理算法实现原理

  • 标记整理可以看做是标记清除的增强
  • 标记阶段的操作和标记清除一致 
  • 清除阶段会先执行整理,移动对象位置

 10.标记整理算法优缺点

  • 减少碎片化空间
  • 不会立即回收垃圾对象

11.各种GC算法优缺点对比

 

名称优点缺点
应用计数算法
  • 发现垃圾立即回收
  • 最大程度减少程序卡顿
  • 无法回收循环引用的对象
  • 时间开销大
标记清除算法
  • 解决了引用计数算法中循环引用对象无法回收的问题
  • 在空间回收过程中会产生空间碎片化,不能让空间最大化的使用
  • 不会立即回收垃圾对象
标记整理算法
  • 减少碎片化空间
  • 不会立即回收垃圾对象

 五.认识V8引擎

  • V8引擎是一款主流的JavaScript执行引擎
  • V8采用即时编译(代码->机器码)
  • V8内存设限(64位大约是1.5G,32位大约800M)

1.V8垃圾回收策略

  • 采用分代回收的思想
  • 内存分为新生代、老生代
  • 针对不同对象采用不同算法  

2.V8中常用的GC算法

  • 分代回收
  • 空间复制
  • 标记清除
  • 标记整理
  • 标记增量 

3.V8内存分配

  • V8内存空间一分为二
  • 小空间用于存储新生代对象(64位 32M| 32位 16M)
  • 新生代指的是存活时间 较短的对象 (局部作用域)

4.新生代对象回收实现

  • 回收过程采用复制算法 + 标记整理
  • 新生代内存区分为二个等大小空间
  • 使用空间为From,空闲空间为To
  • 活动对象存储于From空间
  • 标记整理后将活动对象拷贝至To
  • From与To交换空间完成释放

5.回收细节说明

  • 拷贝过程中可能出现晋升
  • 晋升就是将新生代对象移动至老生代
  • 一轮GC还存活的新生代需要晋升
  • To空间的使用率超过25% 

 6.老生代对象回收实现

  • 老生代对象存放在右侧老生代区域
  • 64位操作系统1.4G,32位操作系统700M
  • 老生代对象就是指存活时间较长的对象(全局作用域 闭包)
  • 主要采用标记清除、标记整理、增量标记算法
  • 首先使用标记清除完成垃圾空间的回收
  • 采用标记整理进行空间优化
  • 采用增量标记进行效率优化

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 是一个流行的 Java 持久化框架,对于性能优化,以下是一些建议: 1. 使用合适的缓存机制:MyBatis 提供了一级缓存和级缓存,默认情况下开启了一级缓存。你可以根据具体的业务需求来决定是否启用级缓存,并且可以配置合适的缓存策略,如使用 Redis 或 Ehcache。 2. 批量操作:对于批量插入、更新或删除操作,可以使用 MyBatis 提供的 `insertList`、`updateList`、`deleteList` 等方法来提高性能,减少与数据库的交互次数。 3. 合理设计 SQL 语句:尽量避免使用 `select *`,只选择需要的字段,以减少数据库传输的数据量。另外,合理设计 SQL 查询语句,避免多表关联查询和复杂的子查询,可以考虑使用分页查询等方式来优化查询性能。 4. 使用延迟加载:MyBatis 支持延迟加载,可以在需要时才加载关联对象,避免一次性加载大量数据。 5. 缓存预热:在系统启动时,可以通过预先查询常用数据并放入缓存中,以提高后续查询的性能。 6. 避免 N+1 查询问题:当一对多关联查询时,避免在循环中执行多次查询,可以使用 MyBatis 的关联查询功能或者使用批量查询方式来解决。 7. 合理配置连接池:MyBatis 使用的数据库连接池对性能也有一定影响,可以根据具体的需求配置合适的连接池参数,如最大连接数、最小空闲连接数等。 8. SQL 优化:使用 MyBatis 提供的 SQL 日志功能,在开发和调试阶段查看生成的 SQL 语句,检查是否存在慢查询、冗余查询等问题,根据需要进行优化。 这些是一些常见的 MyBatis 性能优化建议,根据具体的应用场景和需求,可能会有其他针对性的优化策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值