JVM篇-垃圾回收概述

什么是垃圾

JVM篇-垃圾回收概述

  • 垃圾收集,不是Java语言的半生产物,早在1960年第一门开始使用动态分配和垃圾收集急速的Lisp语言诞生
  • 关于垃圾收集有三个经典问题:
    • 哪些内存需要回收?
    • 什么时候回收?
    • 如何回收
  • 垃圾收集机制是Java的招牌能力,它极大的提高了开发效率

什么是垃圾(Garbage)呢?

  • 垃圾是指运行程序中没有任何指针指向的对象,这个对象就是需要回收的垃圾
  • 如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占用的内存空间会一直保留到应用程序结束,有可能影响其他对象的使用或者导致内存溢出

为什么需要GC?

  • 对于高级语言来说,不进行垃圾回收,内存迟早都会被消耗完。
  • 释放没用的独享,垃圾回收也可以清除内存里的记录碎片,碎片整理将所有占用的堆内存到堆的一段,以便于JVM将整理出的内存分配给的新的对象
  • 随着应付业务越来越庞大、复杂、用户越来越多,没有GC就不能保证应用程序的正常进行,经常造成STW的GC又跟不上实际的需求,所以才会不短地尝试对GC进行优化。

早期垃圾回收

  • 早起C/C++时代,内存回收基本上市手工进行的,开发人员可以使用new关键字申请内存,使用delete关键字进行内存释放。
  • 这种方式可以灵活控制内存的释放时间,但是会给开发人员带来频繁申请释/放内存的管理负担,如果管理不恰当,统一内存泄露,导致程序崩溃
  • 目前来说除了Java,还有C#、Python、Ruby等语言使用自动垃圾回收思想,是未来发展的趋势。

Java垃圾回收机制

  • 自动内存管理,降低内存泄露和内存溢出的风险
  • 自动内存管理,减轻了Java程序员的内存管理负担,可以更专注于业务的开发。

对Java程序员带来的风险

  • 对于Java开发人员而言,自动内存管理如果过度依赖自动,会弱化Java开发人员在程序出现内存溢出时定位问题和解决问题的能力
  • 因此了解JVM自动内存分配和垃圾税收原理就显得重要,只有真正了解JVM是如何管理内存,在遇到类似OOM的异常就能快速定位解决问题
  • 排查内存溢出、内存泄露问题时,当垃圾收集成为系统大刀更高并发量的瓶颈时,我们就必须对这些自动化的技术实施必要的监控和调节

对于GC应该关心那些区域?

JVM篇-垃圾回收概述