频繁回收Young区
较少回收old区
基本不动Perm区(或元空间)
3、垃圾回收的两个阶段(1)标记阶段
引用计数算法
可达性分析算法
(2)清除阶段
标记-清除算法
标记-复制算法
标记-压缩算法
4、运行时数据区垃圾回收情况(1)方法区------------有GC+OOM(outofmemory内存溢出,堆溢出)
(2)堆----------------有GC+OOM
(3)程序计数器-------都没有
(4)本地方法栈-------没有GC,有SOF(stack over flow栈溢出)
(5)虚拟机栈------------没有GC,有SOF
二、垃圾标记阶段目的:区分出内存中哪些是存活对象,哪些是死亡对象
当一个对象已经不在被任何的存活对象继续引用时,就是垃圾对象
(一)引用计数法(java中不用)1、每个对象保存一个整型的引用计数器属性,用于记录对象被引用情况
2、当一个对象引用该对象,引用计数器就+1,当引用失效时,引用计数器就-1
只要对象的引用计数器的值为0,则表示对象可进行回收
3、缺点(1)需要单独的字段存储计数器,增加空间开销
(2)经常更新计数器,增加增加开销
(3)无法处理循环引用情况
(二)可达性分析(根搜索算法,追踪性垃圾收集) 1、可以解决循环引用问题 2、使用条件保证数据一致性
2、原理:以跟对象集合为起始点(GC Roots),
按从上至下的方式搜索被根对象集合所连接的对象是否可达
可达---非垃圾;不可达---垃圾
3、根对象集合(GC Roots )一组必须活跃的引用,主要有以下几类元素:
(1)Java虚拟机栈中引用的对象 :局部变量
(2)本地方法栈中引用的对象:引用类型静态变量,类变量
(3)方法区中引用的常量对象:字符串常量池里的引用
(4)被同步锁synchronized持有的对象
(5)分代收集和局部回收
4、MAT---可以查询GC Root一款强大的Java堆内存分析器
5、对象的状态可触及----不是垃圾
可复活---是垃圾,但是可以通过调用重写的finalize()复活
不可触及--是垃圾,且已经调用了finalize(),但这个方法只能被调用一次,因此不可再复活
三、垃圾清除阶段待更.....



