何时 G1 (垃圾收集器)开始运行并且首先收集哪个内存区域?什么是Java 8上的新GC更新?
答案 0 :(得分:2)
当G1发现需要进行垃圾收集时,它会开始收集实时数据最少的区域。 它通过并发标记阶段在老一代中找到活动对象,并将对象分配给年轻一代,将老化对象提升为老一代。当Java堆占用总量超过默认阈值时,JVM会触发标记阶段。
启动堆占用百分比(IHOP)是触发初始标记收集的阈值。 G1默认情况下通过观察标记所需的时间以及通常在旧一代中分配的内存来确定最佳IHOP。
Java 8中的新功能:
G1收集器字符串复制是Java 8中添加的新功能。由于Strings占用了大量堆内存,因此这个新功能使G1收集器能够识别在堆空间中多次复制的字符串并更正它们指向相同的内部char []数组。
删除PermGen空间并在Java 8垃圾收集中使用MetaSapce是新事物。请阅读this post了解详情。
答案 1 :(得分:2)
什么时候G1(垃圾收集器)开始运行?
向JVM参数添加 - XX:+UseG1GC
时,启用G1GC。
什么时候G1(垃圾收集器)开始运行?它先收集哪个内存区?
请参阅G1GC上的oracle tutorial。
将堆分区为一组大小相等的堆区域,每个区域都是一个连续的虚拟内存区域。某些区域集被分配了相同的角色( eden,survivor,old )
G1执行并发全局标记阶段,以确定整个堆中对象的活跃度。在标记阶段完成之后,G1知道哪些区域基本上是空的。它首先收集在这些区域,这通常会产生大量的自由空间。这就是为什么这种垃圾收集方法称为Garbage-First。顾名思义,G1将其集合和压缩活动集中在堆的可能充满可回收对象的区域,即垃圾。 G1使用暂停预测模型来满足用户定义的暂停时间目标,并根据指定的暂停时间目标选择要收集的区域数。
由G1确定为填海成熟的地区是使用疏散收集的垃圾。 G1将对象从堆的一个或多个区域复制到堆上的单个区域,并且在此过程中压缩并释放内存。这种疏散在多处理器上并行执行,以减少暂停时间并提高吞吐量。因此,对于每次垃圾收集,G1会持续工作以减少碎片,在用户定义的暂停时间内工作。这超出了以前两种方法的能力。