引言

  • 垃圾回收不是Java语言的伴生产物。早在1960年,Lisp语言是第一门使用动态内存分配和垃圾收集技术的语言。
  • 垃圾回收的的三个经典问题:
    • 哪些内存需要回收?
    • 什么时候进行回收?
    • 如何回收?

一、什么是垃圾?

垃圾的概念

  • 运行程序中,没有任何指针指向的对象。

二、为什么需要垃圾回收?

  1. 内存利用角度:
    • 如果不及时对内存中的垃圾进行清理,则垃圾会一致保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出
    • 清除内存的碎片空间,整理出来供新对象使用。
  2. 垃圾收集已成为现代语言的标配。业务越来越庞大和复杂,没有GC就不能保证应用程序的正常进行,经常造成STW的GC跟不上实际的需求,所以不断尝试对GC进行优化。

三、早期垃圾回收

C与C++的垃圾回收

  1. 内存管理方式说明

    • new 关键字进行内存申请,delete关键字进行内存释放。
      1. int main()
      2. {
      3. MiBridge *pBridge = new cmBaseGroupBridge();
      4. // 如果注册失败,则使用delete释放该对象所占内存区域
      5. if(pBridge->redister(k_destroy) != NO_ERRROR)
      6. {
      7. delete pBridge;
      8. }
      9. }
  2. 优势与劣势

    1. 优势:灵活控制内存释放时机。
    2. 劣势:频繁申请和释放内存管理的负担。
      • 如果某个地方,开发人员忘记释放内存,时间增长后,垃圾对象永远无法被清除,最终可导致程序崩溃。

四、Java垃圾回收机制

1. 自动内存管理(分配 + 回收)

优势

  • 内存泄漏和内存溢出的风险降低
    • 降低悬垂指针、野指针、泄露问题的风险。
  • 使得开发人员专注于业务开发

担忧

  • 在内存溢出等场景,开发人员的问题解决能力弱化
  • 垃圾收集成为系统的瓶颈时,必须对这些技术实施必要的监控和调节

2. Java 垃圾回收概述

  • 是垃圾收集器的工作重点
    • 频繁收集Young区。
    • 较少收集Old区。
    • 基本不动Perm区(或元空间)。