第14章 垃圾回收概述

来自尚硅谷宋红康老师讲解的JVM:bilibili链接

1 什么是垃圾

Java = (C++)–


  • 垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。
  • 关于垃圾收集有三个经典问题:
    • 哪些内存需要收集?
    • 什么时候回收垃圾?
    • 如何回收垃圾?
  • 垃圾回收机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战,这当然也是面试的热点

  • 大厂面试题

    • 蚂蚁金服

      • 你知道哪几种垃圾回收器,各自的优缺点,重点讲一下CMS和G1。
      • 一面:JVM GC算法有哪些,目前的JDK版本采用什么回收算法。
      • 一面:G1回收器讲下回收过程
      • GC是什么?为什么需要GC?
      • 一面:GC的两种判定方法?CMS收集器与G1收集器的特点。
    • 百度
      • 说一下GC算法,分代回收说下
      • 垃圾回收策略和算法
    • 天猫
      • 一面:JVM GC原理,JVM怎么回收内存?
      • 一面:CMS特点,垃圾回收算法有哪些?各自的优缺点,他们共同的缺点是什么?
    • 滴滴
      • 一面:java的垃圾回收器都有哪些,说下G1的应用场景,平时你是如何搭配使用垃圾回收器的。
    • 京东
      • 你知道哪几种垃圾回收器,各自的优缺点,重点讲一下CMS和G1,包括原理,流程,优缺点,垃圾回收算法的实现原理。
    • 阿里
      • 讲一讲垃圾回收算法
      • 什么情况下触发垃圾回收?
      • 如何选择合适的垃圾回收算法?
      • JVM有哪三种主要的垃圾回收器?
    • 字节跳动
      • 常见的垃圾回收器算法有哪些,各有什么优劣?
      • system.gc()和runtime.gc()会做什么事情?
      • 一面:Java GC机制?GC Roots有哪些?
      • 二面:Java对象的回收方式,回收算法。
      • CMS和G1了解吗,CMS解决了什么问题,说一下回收的过程。
      • CMS回收停顿了几次,为什么需要停顿两次?

  • 什么是垃圾(Garbage)?

    • 垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。
    • 外文:An object is considered garbage when it can no longer be reached from any pointer in the running program.
  • 如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。

2 为什么需要GC

  • 对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早都会被消耗完,因为不断地分配内存空间而不进行回收,就好像不停地生产生活垃圾而从来不打扫一样。
  • 处理释放没用的对象,垃圾回收也可以清除内存里的记录碎片。碎片整理将所占用的堆内存一道堆的一端,一遍JVM将整理出的内存分给新的对象
  • 随着应用程序所应付的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序的正常进行。而经常造成 STW的GC又跟不上实际的需求,所以才会不断地尝试对GC优化。

3 早期垃圾回收

  • 在早期的C/C++时代,垃圾回收基本上是手工进行的。开发人员可以使用new关键字进行申请,并使用delete关键字进行内存释放。比如以下代码:

    MibBridge *pBridge = new cmBaseGroupBridge();
    // 如果注册失败,使用delete释放该对象所占内存区域
    if (pBridge->Register(kDestroy) != NO_ERROR)delete pBridge;
    
  • 这种方式可以灵活控制内存释放的时间,但是会给开发人员带来频繁申请和释放内存的管理负担。倘若有一处内存区间由于程序员编码的问题忘记被回收,那么就会产生内存泄露,垃圾对象永远无法被清除,随着系统运行时间的不断增长,垃圾对象所耗内存可能持续上升,直到出现内存溢出并造成应用程序崩溃

  • 有了垃圾回收机制后,上述代码极有可能变成这样:

    MibBridge *pBridge = new cmBaseGroupBridge();
    pBridge->Register(kDestroy
    
  • 现在,处理Java以外,C#、Python、Ruby等语言都是用了自动垃圾回收的思想,也是未来发展趋势。可以说,这种自动化的内存分配和垃圾回收的方式已经成为现代语言必备的标准。

4 Java垃圾回收机制

  • 自动内存管理,无需开发人员手动参与内存分配与回收,这样降低内存泄露和内存溢出的风险

    • 没有垃圾回收器,java也会和cpp一样,各种悬垂指针,野指针,泄露问题让你头疼不已。
  • 自动内存管理机制,将程序员从繁重的内存管理中释放出来,可以更专心地专注于业务开发
  • oracle官网关于垃圾回收的介绍:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html

  • 担忧

    • 对于Java开发人员而言,自动内存管理就像是一个黑匣子,如果过度依赖于“自动”,那么这将会是异常灾难,最严重的就会弱化Java开发人员在程序出现内存溢出时定位问题和解决问题的能力
    • 此时,了解JVM的自动内存分配和内存回收原理就显得非常重要,只有在真正了解JVM是如何管理内存后,我们才能够在遇见OutOfMemoryError时,快速地根据错误日志定位问题和解决问题。
    • 当需要排查各种内存溢出、内存泄露问题时,当垃圾收集称为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施比亚的监控和调节
  • 应该关心哪些区域的回收?


  • 垃圾回收器可以对年轻代回收,也可以对老年代回收,甚至是全堆和方法区(Java虚拟机规范没有规定必须对方法区进行回收)的回收。

    • 其中,Java堆是垃圾回收器的工作重点
  • 从次数上讲:
    • 频繁收集新生代
    • 较少收集老年代
    • 基本不动方法区

第14章 垃圾回收概述相关推荐

  1. 第 14 章 垃圾回收概述

    第 14 章 垃圾回收概述 1.垃圾收集面试题 回顾 JVM 学习路线 关于垃圾收集 Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要我们手动的收集. ...

  2. 垃圾oracle_第 14 章 垃圾回收概述

    第 14 章 垃圾回收都不懂,征服面试官! 1.垃圾收集面试题 回顾 JVM 学习路线 关于垃圾收集 Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要我 ...

  3. 第十四章 - 垃圾回收概述

    第十四章 - 垃圾回收概述 文章目录 第十四章 - 垃圾回收概述 1.什么是垃圾 1.1 **大厂面试题** 1.2 什么是垃圾? 2.为什么需要GC 3.早期垃圾回收 4.Java垃圾回收机制 担忧 ...

  4. 第 13 章 一 垃圾回收概述

    第 13 章 垃圾回收概述 1.垃圾收集面试题 回顾 JVM 学习路线 关于垃圾收集 Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要我们手动的收集. ...

  5. 第 15 章 垃圾回收相关算法

    第 15 章 垃圾回收相关算法 1.标记阶段:引用计数器 1.1.标记阶段的目的 垃圾标记阶段:判断对象是否存活 在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪 ...

  6. 第 16 章 垃圾回收相关概念

    第 16 章 垃圾回收相关概念 1.System.gc() 的理解 1.1.System.gc() 方法 System.gc() 方法 在默认情况下,通过System.gc()者Runtime.get ...

  7. 第十五章 - 垃圾回收相关算法

    第十五章 - 垃圾回收相关算法 文章目录 第十五章 - 垃圾回收相关算法 1.标记阶段:引用计数算法 1.1 垃圾标记阶段:对象存活判断 1.2 引用计数算法 1.3 小结 2.标记阶段:可达性分析算 ...

  8. JVM3--垃圾回收机制:垃圾回收概述、垃圾回收算法及分类

    一.垃圾回收概述 1.垃圾对象:运行程序中没有任何指针指向的对象 2.垃圾回收区域: 方法区+堆空间        频繁回收Young区        较少回收old区        基本不动Perm ...

  9. 第十六章 - 垃圾回收相关概念

    第十六章 - 垃圾回收相关概念 文章目录 第十六章 - 垃圾回收相关概念 1.System.gc( )的理解 1.1 手动 GC 来理解不可达对象的回收 2.内存溢出与内存泄露 2.1 内存溢出(OO ...

最新文章

  1. Subsonic使用中
  2. 操作系统引发对未来道路的认知思考
  3. Win系统复制粘贴失效解决办法
  4. JAVAEE框架之Spring注解
  5. 怎样基于谷歌地图的Server缓存公布Image Service服务
  6. vue使用dialog关闭前调用_element-ui的dialog如何关闭自身?
  7. 6410的系统时钟设置(上)---6410时钟控制逻辑框架分析
  8. 基于Jupyter Notebook---卷积神经网络的图像分类(keras对猫狗图像数据集进行分类)
  9. CSS字体系列(CSS、HTML)
  10. bitmap位图详解
  11. 会员管理系统适用于哪些行业
  12. 2021年PTCMS4.3最新采集规则13条
  13. 基于QT框架的离线词典应用程序
  14. 如何把大写金额变为小写数字_如何将小写金额变成大写数值
  15. SSRF漏洞修复方案
  16. Lorenzo Von Matterhorn(暴力)(树)
  17. 工具说明书 - 英语语法检查工具Grammarly
  18. 网络调试助手的使用 调试TCP,UDP
  19. api有哪些 javasocket_java socket API
  20. 思维导图---“计算机硬件系统”练手

热门文章

  1. java 翻译框架_java框架外文翻译
  2. 用苹果电脑开发Android应用,MAC OS Android Studio环境安装
  3. 极限思想在计算机中的应用,数学极限思想的应用论文(共2篇)
  4. 【转】OrCAD 16.3安装和破解方法
  5. 人工智能 AI 绘画发展史
  6. 基于微信小程序的健身小助手小程序
  7. 计算机xp怎么做备份,简单说说windowsXP中如何进行系统备份
  8. 广西百强正菱集团涉非法吸存 当地银监局介入摸底银行贷款 柳州公安通告正菱集团涉非法集资
  9. 如何在邮件正文显示自己的简历
  10. 电脑桌面不见了怎么办?只能调出任务管理器!