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