安卓学习笔记之GC
什么是垃圾
- 没有任何引用指向的一个对象或多个对象(循环引用)
如何定位垃圾
- reference count 引用计数
- root searching 根搜索算法
1、GC roots:线程池变量、静态变量、常量池、JNI指针
常见的垃圾回收算法
- Mark-Sweep(标记清除)--位置不连续、产生碎片
- Copying (拷贝)--没有碎片、浪费空间、浪费内存
- Mark-Compact (标记压缩) --没有碎片、效率偏低
JVM内存的分代模型(用于分代垃圾回收算法)
- 部分垃圾回收器使用的模型
- 新生代+老年代+永久代(1.7)/元数据区(1.8)Metaspace
1、永久代 元数据——Class
2、永久代必须指定大小限制,元数据区可以设置也可以不设置、无上限(受限于物理内存)
3、字符串常量 1.7存在永久代,1.8存在堆里
4、MethodArea逻辑概念—永久代、元数据 - 堆内存(Heap)逻辑分区
1、new(新生代)与old(老年代) 按1:3的比例分区
2、new(新生代)=eden+2个survivior 按8:1:1比例分区
2.1、YGC回收之后、大多数对象会被回收、活着的进入S0
2.2、再次YGC、活着的对象eden+S0->S1
2.3、再次YGC、活着的对象edem+S1->S0
2.4、年龄足够的进入old
2.5、S区装不下的直接进入老年代 - old区
1、顽固分子
2、老年代满了> FGC Full GC - GC Tuning(Generaion)
1、尽量减少FGC
2、MinorGC=YGC
3、MajorGC=FGC
常见的垃圾回收器
- Serial 年轻代 串行回收
- PS 年轻代 并行回收
- ParNew 年轻代 配合CMS的并行回收
- SerialOld 单线程的回收算法
- parallelOld 多线程的回收算法
- ConcurrentMarkSweep(CMS ) 老年代 并发的,垃圾回收和应用程序同时运行,减低STW的时间(200ms)
- G1 (10ms)
- ZGC (1ms)都可以PKC++了
- Shenandoah
- eplison
-
1.8默认的垃圾回收器 :PS+parallelOld