JVM知识点扫盲系列(1)

简介: 每次young gc的时间,和eden空间的大小是正比关系吗?在进入公司之后,这个问题先后被多次问到,那young gc的时间到底和哪些因素有关呢?来看一段代码,逻辑很简单,不断的分配1M的大小,直到触发YGC。

每次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空间的大小是正比关系吗?

答案是没有多大关系。

欢迎工作一到五年的Java工程师朋友们加入Java架构开发:744677563

本群提供免费的学习指导 架构资料 以及免费的解答

不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导

相关文章
|
8月前
|
存储 算法 Java
Java虚拟机相关知识点1
Java虚拟机相关知识点
|
7月前
|
缓存 算法 安全
JVM知识点总结
JVM知识点总结
49 0
|
7月前
|
存储 缓存 监控
JVM关键知识点整理,从入门到提高到实践
Java 虚拟机定义了各种在程序执行期间使用的运行时数据区域。这些数据区域有一些是在Java虚拟机启动时创建的,并在Java虚拟机退出时销毁,有一些数据区域是每个线程独有的,在线程创建时创建,在线程销毁时销毁,根据《Java虚拟机规范》的规定,Java虚拟机运行时所需要管理的数据区域主要如下图所示:
290 0
JVM关键知识点整理,从入门到提高到实践
|
8月前
|
存储 缓存 算法
Java虚拟机相关知识点2
Java虚拟机相关知识点
|
8月前
|
存储 缓存 架构师
京东架构师呕心整理:jvm与性能调优有哪些核心技术知识点
相信很多人对于性能调优都不陌生,为了获得更好的系统性能,或者是为了满足不断增加的业务需求。都需要用到我们的性能调优。所以性能优化在面试中出现的频率特别高,这篇文章我主要给大家整理了大厂里面关于jvm和性能调优用到的一些核心技术知识点。
59 0
|
9月前
|
算法 Java 程序员
阿里P8大牛精心整理JVM性能优化知识点+最新JVM面试题(附答案)
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。它不仅是一种跨平台的软件,而且是一种新的网络计算平台。该平台包括许多相关的技术,如符合开放接口标准的各种API、优化技术等。
|
存储 缓存 Java
JVM内存结构详细总结(结合自身使用经历介绍各个知识点使用场景)
如图JVM运行时数据区域划分为以下6个主要部分:①程序计数器,②虚拟机栈,③本地方法栈,④虚拟机堆,⑤方法区,⑥直接内存,下面对6个部分详细总结,希望可以对路过的朋友有所帮助。
101 0
JVM内存结构详细总结(结合自身使用经历介绍各个知识点使用场景)
|
存储 算法 Java
|
Java
JVM中的一个小知识点:深堆和浅堆的概念
java中的堆内存算是整个内存区域中最重要的一块,几乎所有的对象都分配在堆内存。在堆内存中有两个主要的概念需要我们理解,这对分析java堆内存的故障有着重要的作用,分别是深堆和浅堆。
310 0
JVM中的一个小知识点:深堆和浅堆的概念