「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」
垃圾回收机制目的?
- 发现没用的对象,并对其进行回收,使该空间可以再次被使用。 垃圾回收的意义?
- 防止内存泄露的发生,保证内存的有效使用,减轻java程序员堆内存管理的工作量。 内存泄漏和内存溢出的区别?
- 内存泄漏:指一次程序申请的内存使用完之后,并未释放内存空间,其他程序也不能使用这一块内存。
- 内存溢出:指程序申请内存时,没有足够的内存分配给该程序。
- 内存泄露最终会导致内存溢出的发生。 垃圾回收机制中的算法
- 可达性算法:(发现垃圾)
- 引用计数算法:
- 给堆中的对象添加一个计数器,在对象被引用的同时计数器+1,当对象被引用结束时计数器-1,而任何时候堆中对象计数器为0的对象都是不能再被使用的了。
- 这种方法不适用于对象间互相引用的情景。
- 根搜索算法:
- 也称为可达性算法,程序把堆中的所有应用关系看成是一张图,然后从一个Root节点开始,寻找对应的引用节点,找到引用节点后再寻找这个节点的下一个引用节点,重复这个操作,直到所有被引用的节点寻找完毕,剩余的节点就是没有被引用的节点。
- 引用计数算法:
- 垃圾收集算法:(回收垃圾)
- 标记-清除算法:分为两个步骤,标记和清除
- 标记阶段:对需要回收的对象进行标记。
- 清除阶段:回收被标记的对象的内部空间。
- 实现简单,不需要移动对象,但是也存在问题。
- 算法实现过程中需要暂停整个应用,效率不高。
- 算法执行后会产生不连续的内存碎片,而内存碎片过多这样可能会导致为大的对象分配内存空间时没有足够空间提供给它,而导致再一次触发垃圾回收。
- 复制算法:
- 内存空间使用时,将其分为两个部分。每次只使用一部分,当这一部分空间使用完时,将其中的对象复制到另一部分中去,然后将之前使用的这部分内存空间进行清理。
- 优点:实现简单,不宜产生内存碎片,每次只需要对一半的空间进行垃圾回收。
- 缺点:直接导致使用的内存空间减半,而存活的对象直接影响到算法的效率,存活对象越多,则算法的效率越低。
- 标记整理算法:
- 此算法与标记清除类似,都是先标记再回收。而此算法在回收时是将被标记的所有对象移动到一端,然后将端界之外的内存进行统一的回收。
- 分代收集算法:
- 根据对象存活的生命周期将内存划分为多个不同的区域,一般分为老年代和新生代。
- 新生代:每次垃圾回收只有大量的对象被回收。
- 老年代:每次垃圾回收只有少量的对象被回收。
- 根据对象存活的生命周期将内存划分为多个不同的区域,一般分为老年代和新生代。
- 标记-清除算法:分为两个步骤,标记和清除