目录

一、垃圾回收机制(Garbage Collection)

二、对象回收的时机

引用计数法

可达性分析算法

三、垃圾回收算法

标记-清除算法

标记-复制算法

标记-整理算法

新生代、老年代、永久代看这篇:

四、垃圾收集器


java技术体系中自动内存管理分为两个问题:

  • 给对象分配内存
  • 回收给对象分配的内存

内存的分配涉及到的内存区域是:堆区(堆+方法区)


一、垃圾回收机制(Garbage Collection)

垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。  (仅仅回收无引用对象所实际占用的空间,对象引用不回收)

作用:有效防止内存泄漏、保证内存的有效使用,解放程序员双手。

堆 (包括Java堆 和 方法区)是 垃圾回收的主要对象,特别是Java堆。

三个核心问题:

  1. 那些内存需要回收?(对象是否可以被回收的两种经典算法: 引用计数法 和 可达性分析算法)
  2. 什么时候回收? (堆的新生代、老年代、永久代的垃圾回收时机,MinorGC 和 FullGC)
  3. 如何回收?(三种经典垃圾回收算法(标记清除算法、复制算法、标记整理算法)及分代收集算法 和 七种垃圾收集器)

接下来便来回答这三个核心问题:


二、对象回收的时机

通常有两种方法:

  1. 引用计数法
  2. 可达性分析算法

引用计数法

通过判断对象的引用数量来决定对象是否可以被回收。

引用计数算法是垃圾收集器中的早期策略。在对象中添加一个引用计数器,每当有一个地方 引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可 能再被使用的。

引用计数算法(Reference Counting)虽然占用了一些额外的内存空间来进行计数,但 它的原理简单,判定效率也很高,在大多数情况下它都是一个不错的算法。

缺陷:

public class ReferenceCountingGc {public object instance = null ;public static void testGc ( ) {ReferenceCountingGc objA = new ReferenceCountingGc ( );ReferenceCountingGc objB = new ReferenceCountingGC ( ) ;objA.instance = objB;objB.instance = objA;objA = null;objB =null;//假设在这行发生Gc,objA和objB是否能被回收?system. gc ( );}
}

结果:objA和objB并没有被回收,因为虽然最后两个对象都赋值为空,但是二者之间任然存在相互引用,因此引用计数器不为零。这也从侧面说明了Java虚拟机并不是通过引用计数算法来判断对象 是否存活的。

可达性分析算法

当前主流的商用程序语言(Java、C#,上溯至前面提到的古老的Lisp)的内存管理子系统,都是 通过可达性分析(Reachability Analysis)算法来判定对象是否存活的。这个算法的基本思路就是通过 一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过 程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连, 或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。

其中,GC Roots包括以下几种:

  • 虚拟机栈(栈帧中的局部变量表)中引用的对象;

  • 方法区中类静态属性引用的对象;

  • 方法区中常量引用的对象;

  • 本地方法栈中Native方法引用的对象;


三、垃圾回收算法

  1. 标记-清除算法
  2. 标记-复制算法
  3. 标记-整理算法
  4. 分代收集算法
    1. 新生代(Minor GC)
    2. 老年代(Major GC)(Full GC)
    3. 永久代

标记-清除算法

算法分为“标记”“清除”两个阶段:首先标记出所有需要回 收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回 收所有未被标记的对象。标记过程就是对象是否属于垃圾的判定过程。

缺点:

  1. 执行效率不稳定。如果Java堆中包含大量对象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过 程的执行效率都随对象数量增长而降低。
  2. 内存空间的碎片化问题。标记、清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找 到足够的连续内存而不得不提前触发另一次垃圾收集动作。

具体内存区域看这:Java虚拟机中的年轻代、老年代、永久代图解版

标记-复制算法

解决标记-清除算法面对大量可回收对象时执行效率低 的问题

将可用 内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着 的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

具体内存区域看这:Java虚拟机中的年轻代、老年代、永久代图解版

标记-整理算法

标记-复制算法在对象存活率较高时就要进行较多的复制操作,效率将会降低

标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。

标记-清除算法与标记-整理算法的本质差异在于前者是一种非移动式的回收算法,而后者是移动式的。

如果移动存活对象,尤其是在老年代这种每次回收都有大量对象存活区域,移动存活对象并更新 所有引用这些对象的地方将会是一种极为负重的操作,而且这种对象移动操作必须全程暂停用户应用 程序才能进行,这就更加让使用者不得不小心翼翼地权衡其弊端了,像这样的停顿被最初的虚拟机 设计者形象地描述为“Stop The World”。————来自周志明《深入理解java虚拟机》

“Stop The World”:JVM由于要执行GC而停止了应用程序的执行,这种情形会在任何一种GC算法中发生。此时除了GC所执行的线程之外,所有线程都处于等待状态直到GC完成。

新生代、老年代、永久代看这篇:Java虚拟机中的年轻代、老年代、永久代图解版


四、垃圾收集器

7种作用于不同分代的收集器,其中用于回收新生代的收集器包括Serial、PraNew、Parallel Scavenge,回收老年代的收集器包括Serial Old、Parallel Old、CMS,还有用于回收整个Java堆的G1收集器。(了解即可)

  • Serial收集器(复制算法): 新生代单线程收集器,标记和清理都是单线程,优点是简单高效;
  • Serial Old收集器 (标记-整理算法): 老年代单线程收集器,Serial收集器的老年代版本;
  • ParNew收集器 (复制算法): 新生代收并行集器,实际上是Serial收集器的多线程版本,在多核CPU环境下有着比Serial更好的表现;
  • Parallel Scavenge收集器 (复制算法): 新生代并行收集器,追求高吞吐量,高效利用 CPU。吞吐量 = 用户线程时间/(用户线程时间+GC线程时间),高吞吐量可以高效率的利用CPU时间,尽快完成程序的运算任务,适合后台应用等对交互相应要求不高的场景;
  • Parallel Old收集器 (标记-整理算法): 老年代并行收集器,吞吐量优先,Parallel Scavenge收集器的老年代版本;
  • CMS(Concurrent Mark Sweep)收集器(标记-清除算法): 老年代并行收集器,以获取最短回收停顿时间为目标的收集器,具有高并发、低停顿的特点,追求最短GC回收停顿时间。
  • G1(Garbage First)收集器 (标记-整理算法): Java堆并行收集器,G1收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代),而前六种收集器回收的范围仅限于新生代或老年代。

浅析Java虚拟机的垃圾回收机制(GC)相关推荐

  1. Java-JVM虚拟机内存垃圾回收机制gc入门:引用类型,对象标记算法,回收算法,常见的 garbage collector

    文章目录 GC的优缺点 引用的四种类型 对象标记算法 引用计数法 可达性分析法 回收算法 标记-清除算法(Mark-Sweep) 复制算法 标记-整理算法(Mark-Compact) 分代收集算法 常 ...

  2. Java虚拟机:垃圾回收机制与垃圾收集器

    一.垃圾回收机制: 1.垃圾回收的过程: JVM内存区域的程序计算器,虚拟机栈.本地方法栈的生命周期是和线程同步的,随着线程的销毁而自动释放内存,所以只有堆和方法区需要GC,方法区主要是针对常量池的回 ...

  3. 深入理解Java虚拟机——JVM垃圾回收机制和垃圾收集器详解

    一:概述 说起垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,顾名思义,垃圾回收就是释 ...

  4. Java高级进阶学习资料!Java虚拟机的垃圾回收机制

    Maven权威指南 首先,本书适合所有Java程序员阅读.由于自动化构建.依赖管理等问题并不只存在于Java世界,因此非Java程序员也能够从该书中获益.无论你是从未接触过Maven.还是已经用了Ma ...

  5. JAVA垃圾回收机制GC之我姐是明星

    JAVA垃圾回收机制GC(Garbage Collection) 工作面试老伙伴之java垃圾回收机制 什么是GC,为什么要GC(我的明星老姐) 判断垃圾(找到不常穿的衣服) A 引用计数算法 B 可 ...

  6. 垃圾回收机制GC知识再总结兼谈如何用好GC(转)

    作者:Jeff Wong  出处:http://jeffwongishandsome.cnblogs.com/  本文版权归作者和博客园共有,欢迎围观转载.转载时请您务必在文章明显位置给出原文链接,谢 ...

  7. 学习笔记【Java 虚拟机②】垃圾回收

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 总目录 学习笔记[Java 虚拟机①]内存结构 学习笔记[Java 虚拟机②]垃圾回收 学习笔记[Java ...

  8. Java虚拟机之垃圾回收详解一

    Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...

  9. 一篇文章搞定java中的垃圾回收机制面试题

    一篇文章搞定java中的垃圾回收机制面试题 任何语言在运行过程中都会创建对象,也就意味着需要在内存中为这些对象在内存中分配空间,在这些对象失去使用的意义的时候,需要释放掉这些内容,保证内存能够提供给新 ...

最新文章

  1. python终止线程报错_退出整个程序时出现python线程异常错误
  2. 常用 Linux 发行版操作系统大盘点!
  3. Java中isAssignableFrom,instanceof
  4. Java Security:keytool工具使用说明
  5. 前嗅ForeSpider教程:网站登录配置
  6. Understanding CMS GC Logs--转载
  7. 我为NET狂-----大前端专帖
  8. Java多线程(五)之BlockingQueue深入分析
  9. DOM操作案例之--全选与反选
  10. argmax函数_1.4 TensorFlow2.1常用函数
  11. QT5 C++编写B类IP地址计算第一个可用IP地址、最后一个可用IP地址、网络号、广播地址、子网数、主机数
  12. react特性-声明式编程
  13. 去O入云的探索--Oracle到MySQL的迁移改造方案
  14. DNN的Friendly URL剖析及应用
  15. 细数Android原生工程接入EasyAR-SurfaceTracking遇到的坑
  16. PS去掉图片上的文字的6种基本方法
  17. MySQL批量造数据
  18. 《期权、期货及其他衍生产品》读书笔记(第四章:利率)
  19. java is alphabetic_Unicode字符类\p{IsAlphabetic}
  20. signal 阻塞与屏蔽

热门文章

  1. 【Java基础-1】从JDK配置到第一个程序
  2. 什么是微服务以及微服务的技术点
  3. [转]阳光加利福尼亚 --土老冒的硅谷、旧金山见闻
  4. python爬虫实战1:1980~2020年世界各国GDP数据获取
  5. 杜晶晶老师 网点转型及网点管理专家
  6. amplify color_使用Amplify CLI创建Appsync API
  7. 视频广告屏蔽网站优化笔记
  8. RabbitMQ基本命令学习
  9. 【车牌识别】基于模板匹配实现停车计费系统含Matlab源码
  10. AFL(American Fuzzy Lop)源码详细解读(8)