当前位置: 首页 > news >正文

JVM篇:垃圾回收算法

标记清除

通过遍历GC Root后得到不再被引用的对象,对没被引用的对象做一个标记处理,然后对其进行清除。

优点:速度快

缺点:会产生内存碎片,可能会导致空闲的内存足够保存对象,但由于不连续而保存失败。

标记整理

和标记清除差不多类似,但不同的是它会对清理过的内存进行一个整理,不会产生内存碎片。

优点:没有内存碎片

缺点:涉及到内存地址移动,如果程序中引用变量的内存地址改变还需要进行修改。速度慢

复制算法

需要两块区域,一份From和一份To,将From中存活的区域进行一个复制到To区域。

复制完成后,清空From所用内存,并交换From与To的区域,使得To区域保持空

优点:不会产生内存碎片

缺点:需要双倍的内存空间

分代算法

在JVM中,垃圾回收通常是以上三种垃圾回收机制一起使用,而不是单独使用一种

新生代中,需要保存用完就可以回收的对象,清理比较频繁,而老年代保存的是需要长久使用的对象,因此清理频率低,同时清理速度慢。针对不同的区域采用不同的垃圾清理算法。在JVM中,使用的就是分代算法

所谓伊甸园,就是诞生对象的区域。不管是什么对象,都先存储在伊甸园。如下图所示,当伊甸园不满足容纳新的对象时,会进行一次小的垃圾回收(Minor GC),会将伊甸园中存活的对象复制到幸存区To中并且记录对象存活次数(每执行一次垃圾回收,所有没被回收的对象生命值+1,当生命值超过一定值后(最大为15次),则会放入老年代区域),然后将伊甸园内存清空,交换From与To的内存区域。等到下一次执行Minor GC时,除了扫描伊甸园存活对象之外还要扫描幸存区From中的对象,然后将所有存活的对象存放在幸存区To中后交换From与To的内存区域。

当所有的区域都不能够满足容纳新的对象时,先回进行一次Minor GC,当回收完依旧无法满足容纳新对象则会进行一次大的垃圾回收Full GC,此次回收会对所有的区域进行垃圾回收

当进行垃圾回收时,会暂停所用的用户线程(stop the world,即STW),因为涉及到了内存地址变化,所以其他线程都会停止等到垃圾回收结束后才会接着进行。

相关文章:

  • 基于frp工具实现内网穿透,跨局域网远程SSH登录
  • Spring Boot整合Redis的高效数据缓存实践
  • 《30天自制操作系统》 第一周(D1-D7) 笔记
  • GraphicsMagick 的 OpenCL 开发记录(二十五)
  • Vue2 - keep-alive 作用和原理
  • Sql server强制走索引
  • 【工具变量】中国各省市级是否属于“知识产权示范区”匹配数据(2010-2024年)
  • 强化学习 - Trust Region Policy Optimization (TRPO)
  • 2、互信息(Mutual Information)
  • CSS探索浏览器兼容性
  • 【C++干货铺】C++中的IO流和文件操作
  • Java基础知识-异常
  • Delphi 7 IdHTTP POST 中文乱码得解决
  • k8s实例
  • 【Linux 基础】常用基础指令(上)
  • 【comparator, comparable】小总结
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 2019年如何成为全栈工程师?
  • magento2项目上线注意事项
  • python 装饰器(一)
  • spring-boot List转Page
  • 汉诺塔算法
  • 基于遗传算法的优化问题求解
  • 少走弯路,给Java 1~5 年程序员的建议
  • 我是如何设计 Upload 上传组件的
  • 一、python与pycharm的安装
  • 译自由幺半群
  • 正则表达式小结
  • nb
  • 第二十章:异步和文件I/O.(二十三)
  • #Lua:Lua调用C++生成的DLL库
  • $forceUpdate()函数
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (2)(2.10) LTM telemetry
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Ruby)Ubuntu12.04安装Rails环境
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (转)Linux下编译安装log4cxx
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .form文件_一篇文章学会文件上传
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net framework4与其client profile版本的区别
  • .net Stream篇(六)
  • .NET 的程序集加载上下文
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net反编译工具
  • .Net接口调试与案例
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @Controller和@RestController的区别?
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [20180224]expdp query 写法问题.txt
  • [2544]最短路 (两种算法)(HDU)
  • [ai笔记4] 将AI工具场景化,应用于生活和工作