③标记-整理算法。和新生代不同,在老年代中GC回收的效率不会太高,使用复制算法Survivor空间很可能是不够的,如果将Survivor调大又浪费内存空间,这时就提出了标记-整理算法应对老年代的实际情况。标记-整理算法内存回收时先将所有存活对象标记出来,但不进行清除,而是将存活对象都往内存的一端移动,那么内存末端都是可回收的对象,当这些可回收对象被“挤出”内存边界的时候,则被清除了。
由于HotSpot中把java堆中分为新生代、老年代,他们存活的几率不一样,所以按新生代和老年代采取不同的算法,这就叫分代收集算法,在新生代中采取复制算法,在老年代中使用标记-清除或标记-整理算法。
2.4 垃圾收集器
上面分析了新生代、老年代应该采取怎样的算法,HotSpot中针对实际应用场景,实现了不同的垃圾收集器;
①Serial收集器,复制算法,单线程,Client模式下默认新生代收集器。会有Stop The World问题;
②ParNew收集器,复制算法,多线程,新生代收集器;
③Parallel Scavenge收集器,复制算法,多线程,新生代收集器,与ParNew的区别在于它针对吞吐量设计的;
④Serial Old收集器,标记-整理算法,单线程,Client模式下默认老年代收集器;
⑤CMS收集器,标记-清除算法,多线程,老年代收集器,以降低停顿时间为目标,只在初始标记、重新标记的时候需要Stop The World,采取并发标记和并发清除降低停顿时间;
⑥G1收集器,标记-整理算法+复制算法,多线程,老年代收集器;
三、编译与运行
3.1 javac编译器编译
第一次编译,将.java文件编译成中间语言,输出.Class文件,这期间主要完成语法分析和词法分析(编译原理)、注解处理、语义分析(解语法糖等)、生成字节码Class文件;
3.2 解释器
类加载进解释器运行,类加载的过程有:加载、验证、准备、解析、初始化;
3.3 JIT即时编译器
解释器监控热点代码为JIT编译器进一步编译提供监控数据,触发JIT编译器将热点代码编译成机器代码;
本人知识水平有限,文章难免有纰漏之处,请不吝纠正勘误。