如何判断对象可以回收
引用计数法
当对象被使用1次,计数器就加1,计数器为0的时候会触发垃圾回收机制。
可达性分析算法
从根对象开始,可以到达的对象,不是垃圾回收的对象,不可到达的对象就是垃圾回收的对象。
四种引用
强引用
平常最常见也是我们用的最多的一种引用方式:强引用,作为生命力最强的引用,只要引用还存在着,垃圾收集器(GC)就不会将该引用给回收,即使会出现内存溢出。就是说这种引用只要引用还一直指向的对象,GC是不会去管它的,所以叫它强引用。
软引用
当触发垃圾回收时,如果内存超限,就回收弱引用。
弱引用
当触发垃圾回收时,就回收弱引用。内存超不超限,都会被回收。
虚引用
虚引用是最弱的一种引用,它不会影响对象的生命周期,对象被回收跟它没啥关系。它引用的对象可以在任何时候被回收,而且也无法根据虚引用来取得一个对象的实例。仅仅当它指向的对象被回收的时候,它会受到一个通知。用的最少,类似没有引用,主要用于记录对象的销毁,和记录日志。
终结器引用
- 它用于实现对象的finalize()方法,也可以称为终结器引用。
- 无需手动编码,其内部配合引用队列使用。
- 在GC时, 终结器引用入队。由Finalizer线程通过终结器引用找到被引用对象并调用它的finalize()方法,第二次GC时才能回收被引用对象。
垃圾回收算法
标记清除
先标记后清除
优点:
- 快
缺点:
- 造成空间不连续
标记整理
先标记,后清除,再整理
优点:
- 没有内存碎片
缺点:
- 慢
复制
先标记,后复制,再交换地址
优点:
- 快
- 没有内存碎片
缺点:
- 需要两倍的内存空间
分代垃圾回收

- 对象都产生在伊甸园区
- 当伊甸园空间不足时,触发minor gc。伊甸园和from存活的对象使用复制到to中,存活对象年龄加1,并且交换from to。
- minor gc会引发stop the world ,暂停其他用户的线程,等垃圾回收结束,用户线程才恢复运行
- 当对象寿命超过阈值时,会晋飞升至老年代,最大为15
- 当老年代空间不足时,会先尝试minor gc,如果之后空间仍不足,那么触发full gc,STW的时间更长
垃圾回收器
串行
- 单线程
- 堆内存较小,适合个人电脑
吞吐量优先
- 多线程
- 堆内存较大,多核CPU支持
- 让单位时间内,STW的时间最短
响应时间优先
- 多线程
- 堆内存较大,多核CPU支持
- 尽可能让单次STW的时间最短
CMS收集器
对象:老年代
步骤:
- 初始标记
- 并发标记
- 并发预清理
- 重新标记
- 并发清理
- 收集器重置
284

被折叠的 条评论
为什么被折叠?



