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

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 收集器
看书了解


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

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

就是开闭原则嘛
 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值