1.如何判定对象为垃圾对象
1.1引用计数法:在对象中添加一个引用计数器,当有地方引用这个对象的时候,引用计数器的值就加1
当引用失效时,引用对象值就减1. 很少用 因为 如果对象之间的关系,虽然对象是垃圾但是垃圾回收器不会回收。
1.2可达性分析法:作为GCRoot的对象,有虚拟机栈,方法区的类属性引用的对象,方法区中常量所引用的对象
本地方法栈中引用的对象
2.如何回收
2.1:回收策略
2.1.1标记清楚算法:效率问题,空间问题
2.1.2:复制算法:解决标记清楚算法的效率问题,但是会引入新的浪费空间问题,
Java虚拟机的内存分为两大块一是被线程所共享的区域
堆
新生代
Eden:创建一个对象就会丢到这里面来 。
Survivor (存活期):当没被删就来到了Survivor。
Tenured Gen:一直没死就来到这里。
老年代
方法区
二 是线程所独享的区域
栈 本地方法栈 程序计数器 下图是复制算法解决空间浪费问题:当存活的数量多与20%时 有一个内存担保。
2.1.3:标记整理算法:
2.1.4:分代收集算法:对于新生代 内存回收比较高的就用复制算法,对于老年底,回收比较低的就用你标记复制算法
2.2:垃圾回收器
2.2.1:Serial:单线程
2.2.2;ParNew 多线程 关注点 在降低中间回收的时间,用户交互
2.2.3:Parallel Scavenge :复制算法(新生代收集器) 多线程 达到可控制的吞吐量
Cpu用于运行用户代码的时间 与 cpu消耗的总时间的比值
吞吐量= (执行用户代码时间)/(执行用户代码的时间 + 垃圾回收所占用的时间)
为了控制吞吐量:有两个参数:-XX:MaxGCPauseMillis 垃圾收集器最大停顿时间
-XX:CGTimeRatio 吞吐量大小 服务器端高并发
2.2.4;Cms 标记清除算法: 用在老年代,并发收集器 关注点在减少延时。
2.2.5:G1 利用多核CPU优势 缩短停顿时间,并行和并发,分代收集,空间整合 ,可预测的停顿
3.何时回收