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

JVM认识之垃圾收集算法

一、标记-清除算法

1、定义

标记-清除算法是最基础的垃圾收集算法。它分为标记和清除两个阶段。先标记出所有需要回收的对象(即垃圾),在标记完成后再统一回收所有垃圾对象。

2、优点和缺点

  • 优点:实现简单
  • 缺点:
    • 可能会产生内存碎片,导致内存分配效率降低,影响程序的性能。
    • 标记和清除阶段需要暂停程序的执行,造成一定的延迟。

二、复制算法

1、定义

复制算法,它把可用内存按容量分为大小相等的两块,每次只用其中的一块。当这一块的内存用完了,则会把存活的对象复制到另外的一块上,然后把已使用的内存空间一次清理掉。

2、优点和缺点

  • 优点:
    • 实现简单,运行高效;
    • 由于是对整个内存半区进行垃圾回收,所以不需要考虑内存碎片问题。
  • 缺点:
    • 由于算法代价是把可用内存缩小为原来的一半,所以该算法的内存利用率较低;
    • 对象存活率高时,由于需要进行较多的复制操作,效率会变低。

3、应用

新生代的垃圾回收

把新生代(默认)按8:1:1划分。Eden区有一块,该块占8份;Survior有2块,每块占1份。每次只使用Eden区和其中一块Survior区。当Eden区满了时,会触发Minor GC。Minor GC过程是把Eden区和Survior区的存活对象复制到剩下的一块Survior区,然后一次性清理掉Eden区和之前Survior区的已使用空间。其中,若剩下的那一块Survior区没有足够的连续空间容纳Eden区和已使用Survior区的存活对象,且有老年代进行内存担保,则通过内存担保机制进入老年代。

三、标记-整理算法

1、定义

标记-整理算法,它主要分为标记和整理两个阶段。标记阶段和标记-清除阶段相同,都是标记出垃圾对象。而整理阶段是先把所有存活对象都向一端移动,然后清理掉端边界外的内存。

2、优点和缺点

  • 优点:
    • 解决内存碎片问题,提高堆的内存利用率。
  • 缺点:
    • 由于需要标记所有存活对象并整理所有存活对象的引用地址,所以效率比较低;
    • 在移动过程中,若移动对象被其中对象引用,则还需要调整引用地址,这可能导致程序暂停。

3、应用

老年代垃圾回收

四、增量收集算法

1、定义

若一次性收集JVM中所有的垃圾,则可能会造成程序长时间的停顿。而增量收集算法可以让垃圾回收线程和程序线程交替执行。每次垃圾回收线程只回收一小片区域的内存空间,接着切换到程序线程,依次反复,直到垃圾回收完成。

2、优点和缺点

  • 优点:减少系统停顿时间。
  • 缺点:由于线程切换造成垃圾回收成本上升且系统吞吐量下降。

3、应用

CMS收集器

五、分代收集算法

1、定义

分代收集算法是根据对象的存活周期不同把内存空间划分为几块。一般把JVM堆划分为新时代和老年代,然后根据各个年代的特点使用适当的垃圾回收算法。由于新生代中的对象大部分存活周期短,则可以选用复制算法,只需要进行少量复制成本就可以回收垃圾。而老年代中的对象存活率高,且没有额外空间进行内存担保,则需要选择标记-清除算法或者标记-整理算法进行垃圾回收。

2、优点和缺点

3、应用

大部分JVM的垃圾回收

六、分区算法

1、定义

分区算法把整个堆空间划分为连续的不同小区间,每个小区间独立使用、独立回收。

2、优点和缺点

  • 优点:
    • 控制一次回收多少个小区间,减少GC造成的程序停顿时间;
    • 解决内存碎片问题。
  • 缺点:实现复杂。

3、应用

G1收集器

http://www.lryc.cn/news/344107.html

相关文章:

  • docker-compose部署gitlab
  • Colab/PyTorch - 001 PyTorch Basics
  • 翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习三
  • 基于Seata实现分布式事务实现
  • adss光缆是什么意思
  • JavaScript异步编程——04-同源和跨域
  • 出差——蓝桥杯十三届2022国赛大学B组真题
  • UE5(射线检测)学习笔记
  • 语音识别的基本概念
  • OpenCV Radon变换探测直线(拉东变换)
  • 六、Redis五种常用数据结构-zset
  • FPGA第一篇,FPGA现场可编程门阵列,从0开始掌握可编程硬件开发(FPGA入门指南)
  • C#实现简单音乐文件解析播放——Windows程序设计作业2
  • Python数据爬取超简单入门
  • Dreamweaver 2021 for Mac 激活版:网页设计工具
  • 【Git】Git学习-15:分支简介和基本操作
  • 浏览器提示网站“不安全”原因及解决方法
  • Jmeter详细学习思路和教程
  • 钉钉开放平台创建企业内部H5微应用或者小程序
  • Linux中每当执行‘mount’命令(或其他命令)时,自动激活执行脚本:输入密码,才可以执行mount
  • 【网络协议】----IPv6协议报文、地址分类
  • Llama改进之——SwiGLU激活函数
  • 在数据分析中所需要运用到的概率论知识
  • 韩顺平0基础学Java——第6天
  • react18子组件设置接收默认值和值类型验证
  • Java 高级面试问题及答案(二)
  • 数据统计:词频统计、词表生成、排序及计数、词云图生成
  • W801学习笔记二十四:NES模拟器游戏
  • ECMAScript 6简介
  • 第1个数据库:编号,文本,时间,