概述
安卓内存优化1(JVM和GC原理)
- JAVA虚拟机
- 线程私有
- 1 程序计数器PC
- 2 虚拟机栈
- 3 本地方法栈
- 共享数据区
- 1 方法区
- 2 java堆
- GC垃圾回收器
- GC如何确定内存回收算法
- 回收算法
- 1.标记清除算法Mark-Sweep
- 2.复制算法Copying
- 3. 标记压缩算法Mark-Compact
- 4. 垃圾收集器
JAVA虚拟机
线程私有
1 程序计数器PC
相当于一个执行代码的指示器,用来确认下一行执行的代码的地址,每个线程都有,类似确定执行到哪行代码
2 虚拟机栈
与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期与线程相同,就是我们拼凑所说的栈内存。
每个方法在执行时都会创建一个栈帧,用于存储局部变量表、操作数栈等信息。每一个方法从调用 到完成的过程,
就是入栈到出栈的过程。当求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。
如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。 递归调用的时候很容易出现此类问题。
3 本地方法栈
本地方法栈和虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈是非虚拟机执行Java方法
(也就是字节码)服务,而本地方法栈则是为虚拟机执行Native方法服务的。
有点虚拟机虚拟机栈和本地方法栈合为一个栈区例如: hotspotVM
共享数据区
1 方法区
1 ClassLoader加载类信息常量,静态变量编译后的代码
2 OOM
3 运行时常量沲 : 字面量public satic final java常量,符号引用 类,接口全名,方法名
2 java堆
1 虚拟机能管理的最大的一块内存 GC的主战场
2 OOM
3 对象实例 数组的内容
GC垃圾回收器
GC如何确定内存回收算法
1 引用计数算法
Object o1=new Object(); 计数+1=1
Object o2;
o2=o1; 计数+1=2
o1=null; 计数为1 o1和o2都不会回收
有一个实例呗引用就+1,当个数不为0 就不回收 所以就会出现缺点:互相引用容易出现计算器永不为0,就不会被回收
2 可达性分析算法
其中GRoot可以是:虚拟机栈正在运行使用的引用,静态属性 常量,JNI引用的对象
GC Root对象作为起始点,从这些节点开始向下搜索,搜索所走过的路程成为引用链,当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的
注意 : GC是需要2次扫描才回收对象。
3 引用类型
1 强引用 Object obj=new Object();
2 软引用 SoftReference 内存不足时回收,存放一些重要性不是很强又不能随便让清除的对象
3 弱引用WeakReference 第一次扫到了,就标记下来,第二次扫到直接回收
4 虚引用PhantomReference 不对生存造成任何影响,用于跟踪GC的回收通知
回收算法
1.标记清除算法Mark-Sweep
直接将可回收对象回收,会产生碎片化
2.复制算法Copying
分成两块区域,将第一区域回收后的全部复制到第二区域,减少碎片化但是会更消耗性能,速度慢
3. 标记压缩算法Mark-Compact
先向标记清除法类似,去除可回收对象后,将碎片进行整理,压缩在统一位置
4. 垃圾收集器
1 Serial收集器
串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。新生代、老年代使用串行回收;新生代复制算法、老年代标记-压缩;垃圾收集的过程中会Stop The World(服务暂停)
2 ParNew 收集器
ParNew收集器其实就是Serial收集器的多线程版本。新生代并行,老年代串行;新生代复制算法、老年代标记-压缩
3 Parallel Scavenge收集器
Parallel Scavenge收集器类似ParNew收集器,Parallel收集器更关注系统的吞吐量。可以通过参数来打开自适应调节策略,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量;也可以通过参数控制GC的时间不大于多少毫秒或者比例;新生代复制算法、老年代标记-压缩
吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。
4 Serial Old收集器
Serial收集器的老年代版本 针对老年代;
采用"标记-整理"算法(还有压缩,Mark-Sweep-Compact) 单线程收集;
5 Parallel Old收集器
Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。这个收集器是在JDK 1.6中才开始提供
6 CMS 收集器
CMS采用"标记-清理"算法实现以获取最短回收停顿时间为目标的收集器
初始标记:标记一下GC Roots能直接关联到的对象
并发标记:进行GC Roots Tracing 的过程
重新标记:是为了修正并发标记期间因用户程序继续运行而导致标记产品变动的那一部分对象的标记记录
并发清除:清除不能到达GC Roots的对象
重置线程:更新之前使用过的数据
最后
以上就是奋斗芒果为你收集整理的安卓内存优化1(JVM和GC原理)JAVA虚拟机GC垃圾回收器的全部内容,希望文章能够帮你解决安卓内存优化1(JVM和GC原理)JAVA虚拟机GC垃圾回收器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复