JVM知识点扫盲系列(1)

作者: 美团Java | 来源:发表于2018-07-08 19:10 被阅读940次

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

在进入公司之后,这个问题先后被多次问到,那young gc的时间到底和哪些因素有关呢?

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

// -Xmx2g -Xms2g -Xmn500m -XX:+PrintGCDetails 
// -XX:+UseConcMarkSweepGC -XX:+PrintHeapAtGC
public class GcCase {

    public static void main(String[] args) {
        for (int i = 0; i < 1000; i++) {
            allocate_1M();
        }
    }

    public static void allocate_1M() {
        byte[] _1M = new byte[1024 * 1000];
    }
}

这里设置了新生代的大小是500m,按照8:1:1的比例,eden的大小应该是400m。我们可以大概梳理一下:
1、每次分配1M,分配到第400次时,eden被1M的内存块塞满了
2、为了能够塞下后面的数据的,只能触发一次YGC
3、执行YGC之前,必须等所有的业务线程全部挂起,这个点就是所谓的安全点(safepoint),从这一刻开始,JVM是冻结的,只有虚拟机线程才能执行,也是从这一刻开始计时。

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

1、找出所有可能存活的对象,一个也不能少,这是标记过程的耗时。
从GC Roots开始,遍历对象,所有能遍历到的对象都是算是存活对象,打上一个标记。正常情况下,需要的关心的GC Roots包括下面几个:类的静态引用、业务线程进入安全点时,正在执行方法中的引用类型变量(包含参数)、部分老年代的对象(持有引用执行新生代对象),还有其它不需要太关注的,比如VM内部的数据结构。

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

3、如果开启了GC日志 -XX:+PrintGCDetails,那么在YGC过程中,还会记录一些数据到日志中,这个日志的写入过程,也有可能被影响,这段时间也是YGC的耗时。

所以,young gc的时间,和eden空间的大小是正比关系吗?
答案是没有多大关系。

相关文章

  • JVM基础知识系列

    JVM基础系列 JVM知识点扫盲系列(1) JVM知识点扫盲系列(2) JVM内存的那些事 JVM类加载的那些事 ...

  • JVM知识点扫盲系列(1)

    每次young gc的时间,和eden空间的大小是正比关系吗? 在进入公司之后,这个问题先后被多次问到,那youn...

  • JVM知识点扫盲系列(1)

    每次young gc的时间,和eden空间的大小是正比关系吗? 在进入公司之后,这个问题先后被多次问到,那youn...

  • JVM知识点扫盲系列(2)

    JVM的堆内存实现为什么采用分代思想? 每次被小伙伴问到这种空洞的问题,简直头皮发麻,每次的草草解释,感觉都是苍白...

  • JVM知识点扫盲系列(2)

    JVM的堆内存实现为什么采用分代思想? 每次被小伙伴问到这种空洞的问题,简直头皮发麻,每次的草草解释,感觉都是苍白...

  • JVM系列-02-GC-扫盲

    [TOC] 声明 本篇文章是本人阅读《深入理解JVM》和《java虚拟机规范》时的笔记。记录的都是一些概念性的东西...

  • chapter-1 初识JVM

    本章知识点 1.JVM的概念2.JVM发展历史3.JVM种类4.Java语言规范5.JVM规范 初识JVM - J...

  • JVM介绍系列文章

    知晓JVM系列(一):对JVM总览知晓JVM系列(二):JVM内存管理机制与优化初探知晓JVM系列(三) :常用的...

  • JVM 详解(JVM 内存模型、JMM 内存可见性、类加载机制、

    JVM 知识点汇总 首先看看 JVM 的知识点汇总。 如上图所示,JVM 知识点有 6 个大方向,其中,内存模型、...

  • JVM最多支持多少个线程?你知道吗?

    关于JVM系列面试知识点总结了一个思维导图,分享给大家 McGovernTheory在StackOverflow提...

网友评论

  • 4b2b6b29daf9:为什么不是用尽450m的时候触发young gc
  • 78a4ffa49561:不就是eden啥时候用完啥时候触发吗
  • 02adc464a38d:建议作者空闲时间出一套jvm深度解析的视频教程
  • 11672e96fa39:为啥1M=1024*1000byte,不应该是1024*1024么
    美团Java:@不要说出我的名字 写错了
  • 1d96ba4c1912:eden区越大,越晚触发ygc,需要遍历的对象越多,耗时也越多,按你的意思应该是不管eden区多大,最后存活的对象就那么一点,因此跟eden关系不大吧,不过感觉eden区越大,大概率ygc时间会越长
    26a08370740e:楼主说的对
    tianlang136520:@凌风郎少 你说地对!线上可验证
    cmazxiaoma:和楼主想法一样
  • 板凳上的程序猿:"答案是没有多大关系“ - 结论意味深长,值得我们好好探究:+1: :+1: :+1:

本文标题:JVM知识点扫盲系列(1)

本文链接:https://www.haomeiwen.com/subject/pdrsuftx.html