一.JVM内存结构
- 五大内存区域:程序计数器、java虚拟机栈、本地方法栈、堆、方法区。
二.垃圾判断算法
垃圾回收相关:
- 可回收对象的判定方法:引用计数算法、可达性分析算法;
- 可作为GC Root的对象:虚拟机栈(栈中的本地变量表)中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI(即一般说的native方法)引用的对象;
三.四种引用区别
- 四种:强引用、弱引用、软引用、虚引用;
四.垃圾回收算法
- 标记清除算法:分为标记阶段和清除阶段,缺点:容易产生内存碎片、碎片太多可能会导致后续过程中需要为大对象分配空间时无法找的足够的空间而提前触发新的一次垃圾收集动作;
- 复制算法:优点:实现简单、运行高效且不容易产生内存碎片,缺点:将可用内存缩小为原来的一半,代价昂贵,如果存活对象很多,那么copying算法效率将会大大降低;
- 标记整理算法:适用于存活对象多,回收对象少的情况,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存;
- 分代收集算法:分代垃圾回收不能单独执行GC,Minoc GC:用于清理年轻态区域,Major GC:清理老年代区域,Full GC:(完全GC)清理的是整个堆;
五.内存抖动原因
- 卡顿原因:Android每隔16ms就绘制一次;短时间内产生大量垃圾对象,频繁触发GC卡主线程;注意自定义view的onDraw()方法会被频繁调用,所以在这里面不应该频繁的创建对象;网络访问/大文件的I/O操作;
六.代码进行内存优化
- 特殊方法、设备分级、大图监控、监控GC次数、获取GC总耗时
七.内存优化思路
- GC次数、GC耗时、阻塞式GC次数、阻塞式GC耗时、I/O优化、图片优化
学习地址:https://www.bilibili.com/video/BV1Ka4y1v7Yy?spm_id_from=pageDriver