6.四种引用
(1)强引用:最常见的A a = new A();这种引用,只要强引用在,不会回收所指向的对象
(2)软引用:用来描述有用但非必须的对象,当系统要发生内存溢出时,将这些对象列入回收范围进行第二次回收
(3)弱引用:和软引用类似,但强度更弱,只能生存到下一次垃圾收集之前
(4)虚引用:使用虚引用的目的是在对象被收集器回收时能收到一个系统通知
其中定义其他引用的目的是为了缓存
9.枚举根节点,安全点和安全区域
GC停顿(stop the word)为保证一致性,在可达性分析中需要停止执行线程
解决办法是在特定位置记录栈和寄存器中那些位置是引用,这样的位置被称为安全点,安全点的选择一般是是否具有让程序长时间执行为特征来选定,因为如果每条指令执行时间都很短,不会因为指令序列过长而长时间运行
10.垃圾收集器
新生代:Serial、ParNew 、Parallel Scavenge 采用复制收集算法
老年代:cms(concurrent mark sweep)、Serial old 、Parallel old 采用标记整理或者标记清除
G1
Serial收集器:一个单线程收集器,使用它时必须暂停其他所有工作线程,直到收集结束。简单而高效,并且没有线程交互的开销,可以获取最高效率的单线程收集效率。一般client模式
ParNew收集器:其实就是Serial的多线程版本,除了serial外只有他能和cms配合使用,在Server模式使用
Parallel Scavenge收集器:更加关注吞吐量(用户代码运行时间/cpu总消耗时间),主要适合在后台运算而不要太多交互的任务
Serial Old收集器:使用标记整理收集算法,单线程收集器,主要在client模式使用,如果在server模式,主要有二个用途,一是jdk1.5以及之前和parallel Scavenge配合使用,二是当cms发生cmf(concurrent model failure)时作为后备方案
Parallel old收集器:采用多线程和标记整理,但是仍然不能实现用户线程和垃圾回收线程并发执行
CMS收集器:主要目的是获取最短的回收停顿为目标的收集器,适合追求服务响应速度,停顿时间短,用户体验高的需求,标记清除
分为四个过程:
初始标记、并发标记、重新标记、并发清初
初始标记主要对Gc root能直接关联的对象进行标记,初始标记和重新标记仍然会stop the world,但是这二个过程耗时很少
而比较耗时的引用trance过程和清除过程可以与用户线程并发执行
缺点:对cpu敏感、对浮动垃圾(一起并发中产生的垃圾,可能出现concurrent model failure)而导致full gc、最后就是使用标记清除,存在碎片
G1收集器:
特点:并发与并行、分代收集、空间整合(整体标记整理,局部复制算法)、可预测停顿
将整个java堆划分为多个大小相等的区域,虽然保留新生代和老年代概念,但是不再物理隔离,有计划的避免整个堆得垃圾回收,而是跟踪每个垃圾堆积的价值(回收所能获得空间大小和回收所需要时间的经验值),维护一个优先队列表,每次回收价值最大的区域,并且每个区域都有一个renmenber set来保证不用全堆扫描
过程:
初始标记、并发标记(这段时间对象变化记录到remembered set logs中)、最终标记(合并logs到remembered set中)、筛选回收
新生代:主要采用停止-复制回收算法
老年代:主要采用标记-清除、标记-整理回收算法
Minor GC:发生在新生代的垃圾收集动作,回收频繁,速度较快
Full GC:发生在老年代,一般会至少伴随一次Minor GC,速度很慢
11.类文件结构
(1)Class文件主要采用类似c语言数据结构的伪结构来存储数据。只有无符号数和表二种数据类型
无符号数:u1 u2 u4 u8
表:由多个无符号数或者其他表符合而成
一般前四个字节为魔数CA FE BA BY,接着u2 的次版本号,u2的主版本号
接着是常量池的常量的个数和每个常量(记录字面量和符号引用)
最后包含字段、方法等的个数和描述