Java虚拟机--一段Java程序的生命史(八)

  • 来源:
  • 更新日期:2018-05-23

摘要:标记-整理算法:这个算法是应用在老年代垃圾回收的算法因为老年代不像复制算法那样回收频率高另外它还会浪费空间。

 标记-整理算法:这个算法是应用在老年代垃圾回收的算法因为老年代不像复制算法那样回收频率高另外它还会浪费空间。

5fe3d114-83b1-4915-b2dc-75977c746cae.jpg

标记-整理过程与标记-清除差不多,无非后续步骤不是直接对可回收对象进行清除而是让所有存活的对象都向一端移动然后直接清理掉端边界以外的内存。这地方对应的垃圾收集器是Serial Old收集器、Parallel Old收集器。
分代收集算法:当前商业虚拟机都采用这种算法它的思想就是我们前面提到的对堆内存区域进行分代、新生代和老年代不同的区域采用不同垃圾收集算法。新生代用复制算法、老年代用标记-整理或标记-清除算法。
结合前面所说的,JVM遇到一个new指令时首先去检查整个指令参数能否在方法区的常量池定位到一个类的符号引用,并且检查整个符号引用代表的类是否已被加载、解析和初始化过如果没有则必须先执行对应类加载过程。
类加载检查通过后接下来JVM将会为新生对象分配内存这个过程是在堆中进行的,分配大小在类加载完成后就可以确定,如果堆内存是规整的则采用指针移动对象大小相等距离即可,这种分配方式叫"指针碰撞"如果是零散的,则JVM维护一个列表记录哪些内存可用分配并更新列表记录,这种方式叫"空闲列表"至于采用哪种方式,取决于我们前面提到的堆采用了哪种垃圾收集器决定的。划分完对象内存之后虚拟机会进行必要的初始化操作,接下来需要对对象进行必要的设置,这些信息设置在对象头(类元数据信息、对象的哈希码、对象的GC分代年龄等等)里面,这些工作完成之后,一个新对象产生了,这地方其实还没结束,再下一步就是调用 方法进行程序猿计划的对对象字段进行的赋值操作,最后设置栈中的引用指向这个堆中对象所在的内存地址(直接引用),这时候一个真正可用的对象已经产生了至于后续对对象进行的各种操作及最后的死亡就是前面提到的字节码执行引擎啊GC等等了。