以下是本人对jvm的部分理解
一:类的生命历程
1:加载
① 通过权限定名,获取类的二进制流
② 将字节流的静态数据结构转化为方法区的运行时数据结构
③ 在内存中生成一个代表这个类的对象,作为方法到这个类数据结构的访问入口
2:验证 主要是确保class文件字节流格式符合java虚拟机要求
① 文件格式验证
② 元数据验证
③ 字节码验证
④ 符号引用验证
3:准备
正式为类变量分配内存并设置默认值,这些变量使用的内存都在方法区进行
4:解析
符号引用转化为直接引用的过程
5:初始化
前面的准备阶段赋值为默认值,该阶段赋值的初始值
二:java8垃圾回收器
1:Serial:
Serial收集器适合处理器较少,内存较少的系统环境,该收集器是单线程收集器
基于垃圾复制算法
优点:cpu利用率高
缺点:有延迟,吞吐量较低
2:ParNew收集器
Serial的多线程版本,优缺点和cpu差不多
3:parallel收集器
一款专注于吞吐量的收集器,多线程。
基于垃圾复制算法,其老年代是整理算法。
4:CMS收集器
专注于获取最短停顿时间为目标的收集器
基于垃圾清除算法,但在一定清除次数后有几率触发整理算法
整个过程可以分为初始标记,并发标记,重新标记,并发清除
① 初始标记
标记根节点能直接关联到的对象,速度很快
② 并发标记
标记所有能关联到的对象
③ 重新标记
标记上一阶段并发时用户线程继续动作导致标记变动的记录
④ 并发清除
清除不需要的对象
优点:并发收集,低停顿
缺点:CMS收集器对CPU资源敏感
CMS收集器无法处理浮动垃圾,可以和Serial垃圾收集器配合工作。
5:G1收集器
G1是一个全堆收集器,新生代和老年代一起收集
G1将堆分成一个一个Region区域,每个区域根据情况扮演新生代(Eden,Survivor)
或者老年代,G1运行过程大体上与CMS一致
① 初始标记
标记GC Root能直接关联的对象,并修改TAMS指针,使并发时用户线程可以
在可用的region中分配 新对象
② 并发标记
从Roots节点遍历整个对象图
③ 最终标记
处理并发阶段遗留下来的最后那少量的SATB记录
④ 筛选回收
负责更新Region记录,根据回收价值和成本做排序,尽量回收性价比高的Region