jvm的垃圾回收核心概念总结

93 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

背景

  1. 什么是垃圾?
  2. 如何定位垃圾?
  3. 有哪些垃圾回收算法?
  4. 垃圾回收器及其工作过程?

过程

  • 垃圾 Student对象,持有一个Computer对象的引用。在这里插入图片描述如果在程序中执行了这样的一条语句,computer = null, 变成如下情况在这里插入图片描述如果一个对象不再被使用了,也就是对象没有被引用了,就成垃圾了。
  • 定位垃圾
  1. 引用计数算法,当一个对象被引用一次,此对象被引用的次数就加一。当对象不在被引用的时候,就会被认定为垃圾。但是,存在循环引用问题,导致全是垃圾,但是又都存在引用记录数。
  2. 根可达算法,从根对象(虚拟机栈变量,静态变量,常量池,JNI指针)开始,一层一层往下找,能找的就不是垃圾。找不到的就是垃圾。解决了,引用计数带来的问题。
  • 常见垃圾收集器回收算法 垃圾收集器具体实现过程,就是灵活组合如下三种算法
  1. 拷贝算法(Copying) 缺陷:空间浪费。把空间一分为二(分成两部分)。从一部分拷贝到另一部分。 优点:效率最高。空间换时间。
  2. 标记清除算法(Mark-Sweep) 缺陷:会产生碎片。物理内存地址不连续了。工作过程就是:是垃圾的对象,直接回收即可。 优点:空间不浪费,效率也还行。
  3. 标记压缩算法(Mark-Compact) 缺陷:效率低。挪动对象,清除对象,压缩。 优点:内存地址连续
  • 垃圾回收器及工作过程 在这里插入图片描述
  1. ParNew与CMS配合使用。ParNew是年轻代的垃圾回收器。CMS是老年代的垃圾回收器。物理分代。
  2. Serial与Serial Old配合使用。Serial是年轻代的垃圾回收器。Serial Old是老年代的垃圾回收器。物理分代。
  3. Parellel Scavenge与Parellel Old配合使用。Parellel Scavenge是年轻代的垃圾回收器。Parellel Old是老年代的垃圾回收器。物理分代。
  4. G1是逻辑分代,物理不分代。
  5. 都存在Stop-the-world
  6. Serial是单个线程进行垃圾回收,适用与内存空间较小的场景。
  7. Parellel是多个线程进行垃圾回收,适用于内存空间比较大的场景。
  8. CMS是业务线程和垃圾回收线程一起工作的。因此,满足于几乎不发生卡顿的业务场景,但是CMS不是绝对不发生卡顿现象的,只是发生的概率较小而已。

小结

  • 理解java中的垃圾,及其定位算法
  • 理解常见垃圾回收算法,及垃圾收集器本身由哪些垃圾收集算法组合运用而实现的。
  • 加深对jvm的垃圾回收机制的理解,有助于对java本身运作过程的理解。