点击此处查看最新的网赚项目教程

Java虚拟机自动内存管理程序计数器虚拟机栈本地方法栈Java 堆方法区运行时常量池直接内存对象创建

•初始化

对象内存布局对象头实例数据对齐填充对象访问定位

创建对象后,通过栈上的 reference 数据来操作堆上的具体的对象,reference 类型是一个引用类型,主要实现方式有两种。

•通过直接指针访问。

HotSpot 虚拟机主要使用的是通过直接指针访问。

垃圾收集判断对象是否存活?

•可达性分析

对象引用对象的自救分代收集理论分代假说

1. 弱分代假说:绝大多数对象都是朝生夕死。

2. 强分代假说:熬过垃圾收集次数越多的对象,越不容易消亡。

3. 跨代引用假说:跨代引用相对于同代引用,仅占极少数。

对于假说 1、2,有些对象朝生夕死,有些对象熬过的垃圾收集次数越多,越不容易消亡。对于朝生夕死的对象,放到一起,每次垃圾收集时只关心那些少量的要存活的对象,如果剩余的都是些难以消亡的对象,将他们放在一起,这个区域的垃圾收集频率适当降低,这样垃圾收集的时间效率和内存的有效利用即可兼顾;这样就将对象分成了新生代和老年代;相应的有了 Minor GC、Major GC、Full GC 三种回收类型;针对不同分代区域的对象特征,又发展出了标记-复制算法、标记-清除算法、标记-整理算法。

对于假说 3,是指新生代的对象和老年代的对象有引用关系,导致进行 Minor GC 时,因为这个跨代引用还需要扫描老年代的 GC Roots,耗费性能。其实这个问题,长远来看,因为跨代引用,新生代中的对象也会随着时间推移进入老年代,那么跨代引用其实真就像假说 3 一样只是少数,所以没必要扫描所有的老年代的 GC Roots,只需要将老年代划分为多块,新生代只需要标记哪一块有跨代引用,发生 Minor GC 时,对于跨代引用的处理只需要扫描一小块的老年代对象。

垃圾收集类型垃圾收集算法标记-清除算法标记-复制算法

另外还有 Appel 式回收:

标记-整理算法

和标记-清除算法的主要区别在于,是否移动对象?

1. 如果移动,在 GC 时移动对象会影响用户线程,因为这会导致 Stop The World,这会为用户线程带来更高的延迟。

2. 如果不移动,就会出现内存碎片,此时也可以通过更复杂的内存分配器(比如空闲列表)来解决问题,虽然也有 Stop The World,但通常时间很短,所以对用户线程造成的延迟较小。

3. 标记-整理算法对程序吞吐量更加友好,标记-清除算法对延迟敏感的应用更加友好。CMS 收集器主要使用标记-清除算法实现,但是当遇见内存碎片比较严重的情况时,又改用标记-整理算法来进行 GC。

垃圾收集器Serial 收集器ParNewParallel Scavenge 收集器Serial Old 收集器Parallel Old 收集器CMS 收集器

•初始标记和重新标记需要 Stop The World。

•因为 GC 过程中耗时最长的部分都是和用户线程并发执行的,所以 CMS 收集器的停顿时间是比较短的。

• CMS 收集器的 3 个缺点:

最后,另外还有 3 个新的收集器,有时间再单独讲讲每一个,毕竟太复杂了。

———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: cx-ziy