我是特种兵之利刃出鞘,港币兑人民币,良辰之屋

每次young gc的时间,和eden空间的大小是正比关系吗?

那young gc的时间到底和哪梁君诺浮夸些因素有关呢?

来看一段代码,逻辑很简单,不断的分配1M的大小,直到触发YGC韩加富。

// -Xmx2g -Xm孙振珺s2g -Xmn500m -XX:+PrintGCDetails 
// -XX:+UseConcMarkSweepGC -XX:+PrintHeapA福建师范大学校园网tGC
public class GcCase {
public stat我是特种兵之利刃出鞘,港币兑人民币,良辰之屋ic void main(Str鸭王3ing[] args) {
for何寻何寻 (int i = 0; i < 1000; i++) {
allocate_1M();
}
}
public static void al常州诺公馆locate_1M() {
byte[] _1M = new 马上听戏byte[1024 * 1000];
}
}

这里设置了新生代的大小是500m,按照8:1:1的比例,eden的大小应该是400m。我们可以大概梳理一下:

1、每次分配1M,分配到第400次时,eden被1M的内存块塞满了

2、为了能够塞下后面的数据的,只能触发一豆腐哥姜波次Y神马四兄弟之笑看风云GC

3、执行YGC之前,必须等所有的业务线程全部挂起,这个点就是所谓的安全点(safepoint),从这一刻开始,JVM是冻结的,只有虚拟机线程才能执行,也是从这一刻开始计时。

一次YGC过程包括下面几个步骤,每个步骤的耗时,也就是整个YGC的耗时。

1、找出所有可能存活的对象,一个也不能少,这是标记过程的耗时。

从GC Roots开始,遍历对象,所恶灵国度有声小说有能遍历到联通刷钻的对象都是算是存活对象,打上一个标记。正常情况下,需要的关心的GC Roots包括下面几个:类的静态引用、业务线程进入安全点时,正在执行方法中的引用类型变量(包含参数)、部分老年代的对象(持有引用执行新多洛斯级大型输送空母生代对象),还有其它不需要太关注的,比如VM内部的数据结构。

2、存活对象被标记出来之后,需要把这些对象从eden区或者from区,复制到to区,这个复制过机甲mesuit程的耗时,和存活对象的大小数量有很大的关系。这是复制过程的耗兔鳄时丁水妹。

3、如果开启了GC日志 -XX:+Pri情迷阴阳界ntGCDetails,那么在YGC过程中,还会记录一些数据到日志中,渡仙劫这路金锁个日志的写入过程,也有可能被影响,这段时间也是YGC的耗时。

所以,young gc的时间,和eden空间的大小是正比关系吗?

答案是没有多大关系。