前言
JVM垃圾回收机制
1.如何判断对象可以回收
2.垃圾回收算法
3.分代垃圾回收
一、如何判断对象可以回收
1.1引用计数法
计数算法
1.2可达性分析法
一串葡萄 提起 掉落的就是不可达的
Java虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象
扫描根中的对象 看是否能够沿着GC Root对象为起点的引用链找到该对象,找不到,表示可以回收
哪些对象可以作为GC Root?
MAT(Memory Analyzer)
二、垃圾回收算法
2.1 标记清除
标记:看看哪些是垃圾
清除:做一个清除
优点:速度快
缺点:空间不连续,内存溢出
2.2 标记整理
标记:看看哪些是垃圾
整理:可用对象向前放,没有内存碎片
缺点:移动速度变慢
2.3复制算法
将内存区划分成了大小相等的两块区域
标记:看看哪些是垃圾
复制:将有用部分复制到新的区域
交换两个区域
优点:不会产生碎片
缺点 :占用双倍内存空间
三、分代垃圾回收
实际的jvm虚拟机不会只采用一种算法 他会几种算法相结合
新生代:包含伊甸园、幸存区From 幸存区To
老年代:
Minor GC:新生代内存不足
Full GC:老年代内存不足
1.对象首先分配在伊甸园区域
2.当新生代空间不足时 触发 minor gc 伊甸园和from存活的对象使用copy复制到to中,存活的对象年龄+1 并且交换From to
3.minor gc 会引发 stop the world暂停其他用户的线程 等垃圾回收结束 用户线程才恢复运行
4.当对象寿命超过阈值时,会晋升至老年代 最大寿命是15(4bit)
5.当老年代空间不足,会先尝试触发minor gc 如果之后空间仍不足 那么触发full gc,stop the world 时间会更长
6.如果此时内存还不够 会触发 out of memory