JVM(垃圾回收机制 --- GC)

简介: JVM(垃圾回收机制 --- GC)

啥是垃圾?

不再使用的内存


啥是垃圾回收机制?

自动释放不用的内存

注意: GC 主要是针对 堆 进行的

GC的基本操作单位是 对象, 即GC’回收的是整个对象都不使用的情况


GC 的优缺点

好处: 省心, 写代码简单, 不易出错

缺点: 需要消耗额外资源, 有额外性能开销 , 此外, 易触发 STW 问题

STW 问题

Stop The World

如果内存中垃圾很多, 此时触发一次 GC 操作, 开销可能非常大, 还可能会触发一些锁操作, 因此会导致业务代码无法正常执行

GC 实际工作过程

  1. 找到垃圾 / 判定垃圾
  2. 进行垃圾 (对象) 的释放

找到垃圾 / 判定垃圾

关键是看这个有没有引用 “指向” 它, 没有引用指向的对象, 自然不可能被用到, 就是垃圾了

两种典型实现:

  1. 引用计数 (py / php 做法)
    给每个对象分配一个计数器, 每次创建一个引用指向该对象, 计数器加一, 每次删除一个该对象的引用, 计数器减一, 当计数器为0, 该对象自然就是垃圾了

问题 :

  • 内存空间利用率低 (计数器本身需要存储)
  • 存在循环引用的问题 (py / php 使用引用计数, 需要搭配其他机制来避免循环引用)

2.可达性分析 (Java 做法)

将整个 Java 中所有的对象, 通过 链式 / 树形 结构, 整体给串起来

可达性分析,就是把所有的对象被组织起来的结构视为树, 从树的根节点出发, 遍历树, 所有能被访问到的对象, 标记成 “可达”

  1. JVM 再比对自己手里的对象名单, 将不可达的对象进行回收(每次 new 一个对象的时候, JVM 都会有记录)
  • 可达性分析类似树遍历, 相对于引用计数会慢一些 (因此不必一直执行, 每隔一段时间执行一次就ok ---- “虽迟但到” )
  • 可达性分析遍历的起点 ---- GCroots (一个代码中会有很多起点, 每个起点往下扫一遍, 就完成一次分析)

清理垃圾 (此处为几种垃圾回收算法)

  1. 标记清理

    简单粗暴的做法, 如果灰色区域为垃圾, 白色不是, 则直接清除

    问题:
  • 会产生零散的内存碎片

2.复制算法

把内存空间均分成两份, 每次将不是垃圾的对象复制到另外一边, 然后把整个含垃圾的区域清理掉

问题 :

  • 空间利用率低 (每次只能用到一半空间)
  • 如果垃圾少, 有效对象多, 复制成本就会很大
  1. 整理标记

    类似顺序表删除中间元素, 将不是垃圾的对象从前往后依次排开, 清理剩余空间
  • 保证了空间利用率, 也解决了内存碎片问题
  • 显而易见, 本做法效率也不高

分代回收

基于上述基本策略, 搞了一个符合策略 “分代回收”

历史基本规律: 如果一个东西存在的时间比较长, 那么大概率还会继续长时间存在下去

该规律对于 Java 同样有效, Java 对象要么生命周期特别长, 要么特别短

引入概念: 年龄 ---- 熬过 GC 的轮次 (没被清理)

将堆分成一系列区域

Minor GC : 新生代 GC

Full GC : 老年代 GC

  • 刚创建的对象, 年龄为 0 ,放到伊甸区
  • 熬过一轮 GC ,放入幸存区 (复制算法)
  • 幸存区中对象, 周期性接收 GC 考验, 如果变成垃圾, 就被释放, 如果不是垃圾, 就拷贝到另外一个幸存区 (俩幸存区同一时刻只使用一个), 在二者间来回拷贝 (复制算法)
  • 在幸存区中经过了多轮考验后, 进入老年代
  • 老年代也要周期性 GC 扫描, 只是频率更低
  • 如果老年代的对象是垃圾了, 使用标记整理的方式进行释放

目录
相关文章
|
3月前
|
监控 算法 Java
Java虚拟机(JVM)的垃圾回收机制深度解析####
本文深入探讨了Java虚拟机(JVM)的垃圾回收机制,旨在揭示其背后的工作原理与优化策略。我们将从垃圾回收的基本概念入手,逐步剖析标记-清除、复制算法、标记-整理等主流垃圾回收算法的原理与实现细节。通过对比不同算法的优缺点及适用场景,为开发者提供优化Java应用性能与内存管理的实践指南。 ####
|
2月前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
62 0
|
2月前
|
算法 网络协议 Java
【JVM】——GC垃圾回收机制(图解通俗易懂)
GC垃圾回收,标识出垃圾(计数机制、可达性分析)内存释放机制(标记清除、复制算法、标记整理、分代回收)
|
2月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
3月前
|
机器学习/深度学习 监控 算法
Java虚拟机(JVM)的垃圾回收机制深度剖析####
本文深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法、性能调优策略及未来趋势。通过实例解析,为开发者提供优化Java应用性能的思路与方法。 ####
71 1
|
3月前
|
监控 算法 Java
Java虚拟机垃圾回收机制深度剖析与优化策略####
【10月更文挑战第21天】 本文旨在深入探讨Java虚拟机(JVM)中的垃圾回收机制,揭示其工作原理、常见算法及参数调优技巧。通过案例分析,展示如何根据应用特性调整GC策略,以提升Java应用的性能和稳定性,为开发者提供实战中的优化指南。 ####
54 5
|
3月前
|
存储 算法 安全
JVM常见面试题(四):垃圾回收
堆区域划分,对象什么时候可以被垃圾器回收,如何定位垃圾——引用计数法、可达性分析算法,JVM垃圾回收算法——标记清除算法、标记整理算法、复制算法、分代回收算法;JVM垃圾回收器——串行、并行、CMS垃圾回收器、G1垃圾回收器;强引用、软引用、弱引用、虚引用
|
3月前
|
存储 算法 Java
JVM进阶调优系列(10)敢向stop the world喊卡的G1垃圾回收器 | 有必要讲透
本文详细介绍了G1垃圾回收器的背景、核心原理及其回收过程。G1,即Garbage First,旨在通过将堆内存划分为多个Region来实现低延时的垃圾回收,每个Region可以根据其垃圾回收的价值被优先回收。文章还探讨了G1的Young GC、Mixed GC以及Full GC的具体流程,并列出了G1回收器的核心参数配置,帮助读者更好地理解和优化G1的使用。
|
3月前
|
监控 Java 测试技术
Elasticsearch集群JVM调优垃圾回收器的选择
Elasticsearch集群JVM调优垃圾回收器的选择
83 1
|
3月前
|
算法 Java
JVM有哪些垃圾回收算法?
(1)标记清除算法: 标记不需要回收的对象,然后清除没有标记的对象,会造成许多内存碎片。 (2)复制算法: 将内存分为两块,只使用一块,进行垃圾回收时,先将存活的对象复制到另一块区域,然后清空之前的区域。用在新生代 (3)标记整理算法: 与标记清除算法类似,但是在标记之后,将存活对象向一端移动,然后清除边界外的垃圾对象。用在老年代
29 0