Android知识Android开发

Java虚拟机-初识GC

2016-10-12  本文已影响79人  李冬冬

对象的结构

一般来说,对象由头(head)和域(field)两个部分组成,如下图所示

对象结构
其中head主要包含了对象的大小,种类以及一些gc需要信息。field主要用于存储对象中可访问的部分,也就是我们平时看到的对象的方法变量之类的

对象的生与死

目前主要的对象判活算法有 可达性分析算法引用计数算法

对象的生活环境

就像人类的社会有资本主义和社会主义的划分,对象的生活环境也不相同。目前常见的垃圾回收算法有 标记清除算法(mark-sweep)标记压缩算法(mark-compact)复制算法(copying)

时间开销

空间开销

分配对象开销

mark-sweep由于有内存碎片的存在,分配对象需要通过查询当前内存使用情况,选择一块适合的内存分配,因此mark-sweep在分配内存的时候存在额外的时间开销。而mark-compact和copying分配对象不需要考虑这种情况

对象的辈分

一般情况下将Java堆分为 新生代老年代
对象的分配优先放在新生代,新生代在一段时间内会有大量的临时对象产生,因此存活的对象比较少,比较适合copying算法。对象在经过一定次数的copying gc之后会升级到老年代。老年代一般采用mark-sweep和mark-compact算法,正常情况下运行的是mark-sweep,在内存碎片达到一定程度的时候启动mark-compact。大对象直接存放到老年代。

参考:

  1. 并发垃圾收集器(CMS)为什么没有采用标记-整理算法来实现?
  2. 深入理解Java虚拟机
上一篇下一篇

猜你喜欢

热点阅读