JVM——GC垃圾回收器

GC垃圾回收器

JVM在进行GC时:并不是对这三个区域(新生区,幸存区(from,to),老年区)统一回收,大部分时候,回收都是新生区

GC两种类:轻GC(普通的GC),重GC(全局的GC)

GC题目:

  • JVM的内存模型和分区,详细到每个区放什么

  • 堆里面的分区有哪些?说说他们的特点

Eden,from,to,老年区,

  • GC的算法有哪些:

标记清除、标记整理(压缩)、复制算法、引用计数

  • 轻GC和重GC分别在什么时候发生

GC常用算法

引用计数法:

每一个对象都分配一个计数器(计数器也会占用内存空间),每当对象被调用一次,计数器便加1,当需要GC时,GC会查找被调用最少次的对象,将其淘汰。

该方法用的较少,因为一个大型项目或者循环创建对象时,计数器占用的空间将会变得非常大。

可达性分析

把对象之间的关系理解为一个树状结构,从某一起点出发,能够遍历到达的对象称之为"可达",把无法到达的地方称之为"不可达",将不可达的对象作为垃圾

可达性分析的关键要点为:进行上述遍历,需要有"起点"(GC Roots),起点可以是:

  • 栈中的局部变量
  • 常量池中引用的对象
  • 方法区中,静态成员引用的对象

缺点:

  • 消耗许多时间在扫描上,而某个对象成为了垃圾不一定能够第一时间发现
  • 如果在扫描过程中,对象的引用关系发生了变化,则会导致错误,因此,为了更准确地扫描,需要让其他业务线程暂停工作,这又会导致效率降低

复制算法

  1. 每次GC都会将Eden活的多项移到幸存区中,一旦Eden区被GC后,就会是空的
  2. 幸存0区与幸存1区两个区域有一个是from,有一个是to,且保证:to为空。
  3. 当幸存0区与幸存1区都有对象时,则将对想法少的区中的对象复制移动到另一个区,并将其标志为to,从Eden区来的对象都优先去to
  4. 新生区主要使用的就是复制算法

好处:没有内存碎片

坏处:浪费了一个幸存区的空间(多了一半的空间一直是空的),在极端情况下,from区满了,需要全部复制到to区,十分浪费资源

复制算法最佳使用场景:地点:新生区,情况:在对象存活度较低 此时使用复制算法最佳

标记清除算法

  1. 扫描所有对象,对活着的对象进行标记
  2. 对没有被标记的对象进行清除

缺点:产生内存碎片;需要两次扫描,严重浪费时间

优点:不需要额外的空间

标记压缩算法

对标记清除算法的再次优化

  1. 扫描所有对象,对活着的对象进行标记
  2. 对没有被标记的对象进行清除
  3. 压缩内存,将活着的对象向一段移动,清除内存碎片

缺点:又多了一个移动成本

优点:不会产生内存碎片

标记清除压缩算法

结合标记清除算法与标记压缩算法

先清理五次,再进行压缩

总结

内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)

内存整齐度:复制算法=标记压缩算法>标记清除算法

内存利用率:标记压缩算法>标记清除算法>复制算法

GC:分代收集算法

年轻区:

  • 存活率低
  • 复制算法

老年区:

  • 区域大,存活率高
  • 标记清除(内存碎片不是太多的情况下)+标记压缩(内存碎片太多就压缩)混合实现
相关推荐
灰灰勇闯IT15 分钟前
RN路由与状态管理:打造多页面应用
开发语言·学习·rn路由状态
wd_cloud15 分钟前
QT/6.7.2/Creator编译Windows64 MySQL驱动
开发语言·qt·mysql
菜鸟233号17 分钟前
力扣513 找树左下角的值 java实现
java·数据结构·算法·leetcode
亭上秋和景清19 分钟前
指针进阶:函数指针详解
开发语言·c++·算法
胡萝卜3.020 分钟前
C++现代模板编程核心技术精解:从类型分类、引用折叠、完美转发的内在原理,到可变模板参数的基本语法、包扩展机制及emplace接口的底层实现
开发语言·c++·人工智能·机器学习·完美转发·引用折叠·可变模板参数
9ilk21 分钟前
【C++】--- C++11
开发语言·c++·笔记·后端
biter down1 小时前
C++ 函数重载:从概念到编译原理
开发语言·c++
Neoest1 小时前
【EasyExcel 填坑日记】“Syntax error on token )“: 一次编译错误在逃 Runtime 的灵异事件
java·eclipse·编辑器
自在极意功。1 小时前
Web开发中的分层解耦
java·microsoft·web开发·解耦
是一个Bug1 小时前
ConcurrentHashMap的安全机制详解
java·jvm·安全