文章目录

  • 往期文章
    • 前言
    • 一、回顾JVM的几个部分
    • 二、什么是垃圾?
    • 三、为什么需要GC?
    • 四、早期的垃圾回收
    • 五、Java的回收机制
    • 六、大厂面试题
    • 参考资料
    • 十几年前的磁盘碎片整理
    • 自动内存管理的优点:
    • 关于自动内存管理的担忧:
    • 应该关心哪些区域的回收呢?
    • 蚂蚁金服
    • 百度
    • 天猫
    • 滴滴
    • 京东
    • 阿里
    • 字节跳动


往期文章

JVM——(1)为什么学习虚拟机
JVM——(2)聊聊JVM虚拟机
JVM——(3)类加载子系统
JVM——(4)运行时数据区的概述与程序计数器(PC寄存器)
JVM——(5)运行时数据区的虚拟机栈
JVM——(6)运行时数据区的本地方法栈
JVM——(7)运行时数据区的堆空间
JVM——(8)运行时数据区的方法区
JVM——(9)对象的实例化与访问定位
JVM——(10)执行引擎
JVM——(11)String Table(字符串常量池)
JVM——(12)垃圾回收概述
JVM——(13)垃圾回收相关算法
JVM——(14)垃圾回收相关概念的概述
JVM——(15)垃圾回收器详细篇
JVM——(16)Class文件结构一(描述介绍)
JVM——(17)Class文件结构二(解读字节码)
JVM——(18)Class文件结构三(JAVAP指令)
JVM——(19)字节码指令集与解析一(局部变量压栈、常量变量压栈、出栈局部变量表指令)
JVM——(20)字节码指令集与解析二(算数指令)
JVM——(21)字节码指令集与解析三(类型转换指令)
JVM——(22)字节码指令集与解析四(对象创建与访问指令)
JVM——(23)字节码指令集与解析五(方法调用指令与方法返回指令)
JVM——(24)字节码指令集与解析六(操作数栈管理指令)

前言

从本篇开始,我们正式开始接触JVM的垃圾回收相关知识,本篇文章先进行概述与介绍

一、回顾JVM的几个部分


我们希望通过学习JVM达到的目的是让系统在业务越来越复杂的情况下使性能更加的优化效率高

所以我们一般要将上层代码进行优化、底层在系统层面优化

那么当我们进行JVM虚拟机优化的时候,就需要对性能进行监控

在性能监控前提的是懂整个数据在Java虚拟机的分配与策略:内存的分配与回收

那么要想明白内存的分配与回收,就要懂:内存结构

而在内存结构之前呢,还得需要知道:类加载、class文件结构、执行引擎
JVM——(12)垃圾回收概述_垃圾回收

二、什么是垃圾?


上面我们还在说垃圾回收的概述,那么什么是垃圾?为什么要被回收?

其实垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。

如果不及时对内存中的垃圾进行清理,那么这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出

十几年前的磁盘碎片整理

================================

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kndTeBBj-1619460551552)(https://segmentfault.com/img/bVcQzPm)]

三、为什么需要GC?


我们前面也提到过如果不进行垃圾回收内存迟早都会被消耗完,因为不断地分配内存空间而不进行回收,就好像不停地生产生活垃圾而从来不打扫一样

除了释放没用的对象,垃圾回收也可以清除内存里的记录碎片。碎片整理将所占用的堆内存移到堆的一端,以便JVM将整理出的内存分配给新的对象

随着应用程序所应付的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序的正常进行。而经常造成STW的GC又跟不上实际的需求,所以才会不断地尝试对GC进行优化

四、早期的垃圾回收


在早期的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等语言都使用了自动垃圾回收的思想,也是未来发展趋势,可以说这种自动化的内存分配和来及回收方式已经成为了现代开发语言必备的标准

五、Java的回收机制


对于这种分配内存,在Java中有自动内存管理,具体详细可以查看官方文档:访问入口

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

没有垃圾回收器,java也会和cpp一样,各种悬垂指针,野指针,泄露问题让你头疼不已。自动内存管理机制,将程序员从繁重的内存管理中释放出来,可以更专心地专注于业务开发

关于自动内存管理的担忧:

对于Java开发人员而言,自动内存管理就像是一个黑匣子,如果过度依赖于“自动”,那么这将会是一场灾难,最严重的就会弱化Java开发人员在程序出现内存溢出时定位问题和解决问题的能力。

此时了解JVM的自动内存分配和内存回收原理就显得非常重要,只有在真正了解JVM是如何管理内存后,我们才能够在遇见OutofMemoryError时,快速地根据错误异常日志定位问题和解决问题。

当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节。

应该关心哪些区域的回收呢?

================================
JVM——(12)垃圾回收概述_JVM_02

垃圾收集器可以对年轻代回收,也可以对老年代回收,甚至是全栈和方法区的回收

其中Java堆是垃圾收集器的工作重点

其次频繁收集Young区、较少收集Old区、基本不收集Perm区(元空间)

六、大厂面试题


体会一下大厂对于JVM垃圾回收方面的面试题

蚂蚁金服

  • 你知道哪几种垃圾回收器,各自的优缺点,重点讲一下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回收停顿了几次,为什么要停顿两次?