android Jvm 笔记。内存溢出。内存区域划分。垃圾回收气

来源:互联网 发布:淘宝店怎样增加流量 编辑:程序博客网 时间:2024/05/21 08:57

native 溢出 也就是 direct memory 内存溢出 直接内存,不是虚拟机内存。是系统内存。


是因为 申请的内存在 direct memory 中,垃圾回收进行时,会对 direct memory 进行回收。但是direct memory 不能像,新生代,老年代那样,
发现内存控件不足了就通知收集器进行垃圾回收,他只能等待 老年代 满了后 Full GC,然后 “顺带着”帮他清理掉内存的废气对象。否则他只能一直等到抛出内存异常时,先 catch 掉,在catch块中 “大喊”一声 System.gc()。要是虚拟机还是不听(System.gc设置关闭,调用不起作用 参数 -XX:+DiskableExplicitGC开关)。那就只能眼睁睁的看着堆中还有很多空闲内存。自己却不得不抛出内存溢出异常了。




垃圾收集器


新生代收集器 采用 复制算法。


serial 连续的, jdk 1.3.1之前是新生代手机的唯一选择。单线程收集器。收集时,会暂停其他所有工作线程,直到他结束。Stop The World。
       (单个Cpu的环境来说)效率高,由于暂停了其他线程,没有线程交互的开销,只有他一个专心做垃圾收集获得最高的单线程收集效率。
   (多个的话)他暂停了 其他cpu的工作。就低了。

ParNew 收集器其实就是 Serial收集器 的多线程版本。其他跟serial收集器完全一下。新生代收集器。只有他能与CMS(concurrent mark sweep)收集器配合工作。
       CPU较少情况下,不一定不 serial收集器高效。 他对于GC是系统资源的有效利用还是有好处的。


并发与并行收集器 概念(指多线程下)


并行(Parallel):指多天垃圾收集线程并行工作,但此时用户线程仍处于等待状态。


并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续执行,而垃圾收集程序运行于另一个CPU上。


Parallel Scavenge 收集器 目标是达到一个可用控制的吞吐量。可以自适应调节。


老年代 收集器 
Serial Old 收集器 单线程收集器,使用 “标记-整理” 算法


Parallel old 收集器 老年代收集器,使用多线程和“标记-整理”算法。在 jdk1.6才开始提供。


CMS(Concurrent Mark Sweep)收集器 是一种以获取最短回收停顿时间为目标的收集器。使用“标记-清除” 算法。
运作过程复杂,分4个步骤:
1、初始标记
2、并发标记
3、重新标记
4、并发清除


初始标记、重新标记 会stop the world。 但很快。另外2个比这个耗时,但可以与用户线程一起工作。


缺点: 看书


详情请看 深入理解java虚拟机一书。


G1 收集器
看书了解


能用接口就不用抽象类,能用抽象类就不用类

就是接口的抽象级别是最高的,也是最灵活的,有时候类继承用的多了反而会让结构不可控制

就是开闭原则嘛
 



0 0
原创粉丝点击