CMS收集器是一种以获取最短回收停顿时间为目标的收集器,它的运作过程分为四个步骤,包括:
1> 初始标记
2> 并发标记
3> 重新标记
4> 并发清除
初始标记:初始标记需要stw,初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快。
并发标记:并发标记阶段就是从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行。
重新标记:重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间通常会比初始标记阶段稍长一些,但也远比并发标记阶段的时间短。
并发清除:这个阶段清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的。
6、Garbage First 收集器(简称G1收集器)
G1不再坚持固定大小以及固定数量的分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。如图。
G1收集器的运作过程大致可以划分为以下四个步骤:
初始标记:仅仅只是标记一下GC Roots能直接关联到的对象,
并发标记:从GC Root开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,这阶段耗时较长,但可与用户程序并发执行。
最终标记:对用户线程做另一个短暂的暂停,用于处理并发阶段结束后仍遗留下来的最后那少量的SATB记录。
筛选回收:负责更新Region的统计数据,对各个Region的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划,可以自由选择任意多个Region构成回收集,然后把决定回收的那一部分Region的存活对象复制到空的Region中,再清理掉整个旧Region的全部空间。这里的操作设计存活对象的移动,是必须暂停用户线程,由多条收集器线程并行完成的。
四、类加载机制
当我们运行一个类的时候,我们会通过java.exe来调用jvm.dll文件,创建一个类加载器,然后再加载我们的类,我们的类在加载的过程中会经历加载、验证、准备、解析、初始化。
加载:此阶段将类的二进制字节流加载到内存中。
验证:此阶段将验证文件的格式、元数据验证、字节码验证、符号应用验证,保证这些代码运行后不会危害虚拟机自身的安全。
准备:准备阶段是为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始默认值。
解析:解析阶段是Java虚拟机将常量池内的符号引用替换为直接引用的过程,符号引用是用符号来描述所引用的目标,而直接引用是用地址来描述所应用的目标。
初始化:由于之前准备阶段是给静态变量赋值默认值,而初始化阶段是给静态变量赋值他的真实的值。
五、类加载器
1、启动类加载器:这个类加载器负责加载存放在<JAVA_HOME>\lib目录中的系统的jar。
2、扩展类加载器:这个类加载器负责加载存放在<JAVA_HOME>\lib\ext目录中的扩展类jar。
3、应用程序类加载器:这个类加载器负责加载我们自己写的类。
六、双亲委派模型