目录

  • 一.前言
  • 二.如何判断一个对象是垃圾
    • Ⅰ. 引用计数法
    • Ⅱ. 可达性分析
    • Ⅲ. GC ROOT 对象
  • 三.垃圾回收算法
    • Ⅰ. 标记——清除算法
    • Ⅱ. 复制算法
    • Ⅲ. 标记——整理算法:
  • 四.垃圾收集器的评判标准
  • 五.垃圾收集器的类型
    • Ⅰ. 串行收集器
    • Ⅱ. 并行收集器
    • Ⅲ. 并发收集器
  • 六.CMS 收集器
  • 七.G1 收集器
  • 八.如何选择垃圾收集器?
  • 九.Happy Ending

一.前言

Java的垃圾回收机制是自动的,不需要程序员手动进行内存管理。当Java应用程序创建对象时,它们存储在堆内存中。当对象不再被引用时,垃圾回收器会自动标记这些对象为垃圾,并将它们从堆内存中清除,释放空间。

二.如何判断一个对象是垃圾

Ⅰ. 引用计数法

如果要操作对象,必须通过引用来进行。如果一个对象没有任何引用与之关联,则说明该对象基本不太可能在其他地方被使用到。那么这个对象就成为可被回收的对象了。这种方式实现简单,效率较高,但是它无法解决循环引用的问题,因此在 Java 中并没有采用这种方式(Python 采用的是引用计数法)

Ⅱ. 可达性分析

以一个 GC Root 对象作为起点进行搜索,如果在 GC Roots 和对象之间没有可达路径,则称该对象是不可达的。

Ⅲ. GC ROOT 对象

  • 栈帧中的本地变量表中引用的对象。
  • 方法区中静态属性引用的对象。
  • 方法区中常量引用的对象。
  • 本地方法栈中引用的对象。

三.垃圾回收算法

Ⅰ. 标记——清除算法

效率较低,有空间碎片。Old 区使用的算法

Ⅱ. 复制算法

空间碎片少,但会浪费空间。存活对象较少才会使用的算法。young区使用的算法

Ⅲ. 标记——整理算法:

空间碎片少,效率较低。Old 区使用的算法

四.垃圾收集器的评判标准

垃圾收集器是对垃圾回收算法的实现,JVM 中提供了很多垃圾收集器,我们如何评判一个垃圾收集器的好坏呢?

  • 垃圾收集器的执行效率 = 吞吐量 / 停顿时间
  • 吞吐量 = 用户代码执行时间/(用户代码执行时间+停顿时间)

五.垃圾收集器的类型

Ⅰ. 串行收集器

只有一个垃圾回收线程,在垃圾回收时暂停用户代码线程,如 Serial 和 Serial Old收集器。

Ⅱ. 并行收集器

吞吐量优先,多个垃圾收集器线程共同工作, 尽快完成垃圾收集。如 ParNew,Parallel Scanvenge, Parallel Old 收集器。

Ⅲ. 并发收集器

停顿时间优先,用户线程和垃圾回收线程一同工作,用户代码线程也会完全停止一小段时间,如 CMS,G1 收集器

六.CMS 收集器

CMS(concurrent mark sweep,并发标记扫描)收集器是并发收集器,是基于标记 ——清理的算法进行垃圾回收,用于 OldGC。

  • 优点:并发收集、低停顿
  • 缺点:会产生大量空间碎片,停顿时间虽然短但是不可控。

问:CMS 收集器为什么不进行并发的初始标记
因为初始标记速度很快,不值得多开线程,开线程也是需要耗费资源的。

七.G1 收集器

  • G1(garbage first,垃圾优先)收集器是并发收集器,从 JDK1.7 开始支持,能进行OldGC 和 YoungGC。Old 区采用标记整理算法,Young 区采用复制算法。
  • G1 收集器没有固定的 Old、Young、Eden、Survivor 区,而是将内存分为一个个大小相等的 Region(格子,1Mb~32Mb)。每次垃圾回收后,Region 的用途可以发生改变,提高了内存的灵活性和利用率。

G1 收集器可以根据开发者设置的参数,停顿时间的期望值,优先筛选回收存活的对象比较少,垃圾对象比较大的区域 Region,可以把更多空余的空间释放出来。

八.如何选择垃圾收集器?

  • 优先让服务器自己来选择
  • 如果内存小于 100M,使用串行收集器
  • 如果服务器是单核,并且没有停顿时间要求,使用串行收集器
  • 如果允许停顿时间超过 1 秒,选择并行收集器
  • 如果停顿时间不能超过 1 秒,使用并发收集器

九.Happy Ending


送书抽奖活动

《深入浅出Java虚拟机:JVM原理与实战》 Java虚拟机核心技术一本通:通过实战案例+执行效果图+核心代码,剖析探索JVM核心底层原理,强化推动JVM优化落地,手把手教你吃透Java虚拟机深层原理!

  • 系统:全书内容层层递进,深入浅出,手把手教你吃透JVM虚拟机核心技术
  • 深入:剖析探索JVM核心底层原理,强化推动JVM优化落地
  • 实战:原理与实践相结合,懂理论,能落地,实战化案例精准定位技术细节
  • 资源:附赠全书案例源代码,知其然更知其所以然,快速上手不用愁

本书主要以 Java 虚拟机的基本特性及运行原理为中心,深入浅出地分析 JVM 的组成结构和底层实现,介绍了很多性能调优的方案和工具的使用方法。最后还扩展介绍了 JMM 内存模型的实现原理和 Java 编译器的优化机制,让读者不仅可以学习 JVM 的核心技术知识,还能夯实 JVM 调优及代码优化的技术功底。
本书适合已具有一定 Java 编程基础的开发人员、项目经理、架构师及性能调优工程师参考阅读,同时,本书还可以作为广大职业院校、计算机培训班相关专业的教学参考用书。

本次活动赠书2本,评论区抽取2位小伙伴送书

活动时间: 截止到2023-07-15 20: 00 参与方式: 点赞、收藏本文章,并任意评论(不折叠就行) 抽奖时间: 2023.07.15 公布时间: 2023.7.15 通知方式:交流群内公布或私信通知

更多活动可继续关注上方的博客,好运总会轮到你!!!