前言:写这篇文章的目的在于解惑自己对垃圾回收的疑问!
待解答疑问:
1、那些对象需要回收?
2、怎么判断对象已不再使用?
3、垃圾回收时为什么要停顿?
那么此文将从五个方面来说明垃圾回收:
- why: 为什么要回收?
- what: 回收什么?
- who: 谁回收?
- when: 何时回收?
- how:怎样回收?
why:为什么要回收?
主要堆上分配给对象的内存,如果不再使用的对象不进行回收,内存终究会耗尽。
what:回收什么?
堆上已不再使用的对象。
who:谁回收?
垃圾回收器。
when:何时回收?
当堆内存使用占比达到设置的阀值时。
how:怎样回收?
最简单的工具就是“标记-清除”,先对堆上内存区域标记是否使用。然后再统一清除。(实际的执行远比这复杂的多)
那些对象需要回收?
没有引用了对象。
怎么判断对象不再使用?
最简单的方式通过引用计数。每引用一次+1,每执行完成一次-1。最后如果是0则可认为是无引用;
垃圾回收时为什么要停顿?
停顿是为了标记清除不使用的内存。如果一边标记,一边使用已标记的内存状态就可能发生变化。增加垃圾回收的复杂度!(理论上不全局停顿是可以做到的)