一、概述
什么是垃圾?
在运行程序中没有任何指针指向的对象称为垃圾,若不及时回收则该对象会一直占用内存直到程序结束
为什么需要垃圾回收
垃圾回收的重点区域
二、垃圾回收算法
三、内存泄漏
如果堆中出现无法回收的垃圾,那么就称为内存泄漏
内存泄漏的例子
- 静态集合类
- 单例模式:当单例对象持有外部引用时,会导致该外部引用对象一直存活直到程序结束
- 内部类持有外部类
- 各种资源连接每及时执行close
- 缓存泄漏:使用缓存存储数据时时间一长就会有大量无用的对象在缓存中,导致大量无用的元素保存在内存中
四、可达性分析算法
标记GC Roots直接或间接引用的对象,它们不是垃圾
特点:实现简单、执行高效,防止内存泄漏
GC Root
面试题
垃圾回收算法
标记清除算法
根据可达性分析标记存活对象,没有被标记的对象所占的内存可以被新对象覆盖
特点:速度还行但是内存碎片多
标记复制算法
根据可达性分析标记存活对象,将存活对象复制到另一片空白的区域,并将原先区域的所有对象进行清除
特点:速度快而且不产生内存碎片,但是需要额外的空间进行复制操作
标记压缩算法
根据可达性分析标记存活对象,将存活对象进行压缩,使其占用一块连续的内存
特点“:速度慢但是没有内存碎片也不需要额外的内存空间
增量回收算法
垃圾收集线程每次只回收一块小内存,接着切换到程序线程,依次反复直到垃圾回收完成,典型的有G1的垃圾回收机制
特点:提高了响应速度但降低了吞吐量
五、System.gc()和finalize()
System.gc()
提醒垃圾回收器去执行Full GC,但不会立即执行
finalize()
当一个对象首次被当成垃圾时,再回收之前执行finalize()方法,可以在finalize()方法中被其它存活对象引用完成"复活"
作用:在该对象销毁前,对某些资源进行释放,像Socket、IO资源等
六、垃圾回收的并行与并发
- 并行:多条垃圾回收线程同时进行垃圾回收
- 串行:单条垃圾回收线程同时进行垃圾回收
- 并发:用户线程和垃圾回收线程同时进行
七、安全点
八、五种引用
面试题
weakHashMap
用来存储一些不太重要的缓存,它使用弱引用来关联数据,垃圾回收时,弱引用是一经发现直接回收的,不会因为缓存太大导致OOM