JVM 的 GC 是指垃圾回收,主要是对堆内存的回收。本文将介绍 JVM 中一次完整的 GC 流程是怎样的,首先抛出第一个问题,什么样的对象会是 JVM 回收的目标?

一、可达性分析算法(GC Roots)

有一种引用计数法,可以用来判断对象被引用的次数,如果引用次数为0,则代表可以被回收。

这种实现方式比较简单,但对于循环引用的情况束手无策,所以 Java 采用了可达性分析算法

即判断某个对象是否与 GC Roots 的这类对象之间的路径可达,若不可达,则有可能成为回收对象,被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。

在 Java 中,可作为 GC Roots 的对象包括以下几种:

  1. 虚拟机栈(本地变量表)中引用的对象
  2. 方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中引用的对象

二、JVM中的堆结构

JVM 中的堆可划分为两大部分,新生代和老年代,大小比例为1:2,如下:

其中,新生代分为 Eden 区和 Survivor 区, Survivor 幸存者区又分为大小相等的两块 from 和 to 区。这便是 JVM 中堆的结构和各部分默认的比例,当然这些比例都可通过对应 JVM 参数来调整。

2.1 为何新生代要分为三个区

这里需要介绍新生代的垃圾回收算法——复制算法。该算法的核心是将可用内存按容量划分为大小相等的两块,每次回收周期只用其中一块,当这一块的内存用完,就将还存活的对象复制到另一块上面,然后把已使用过的内存空间清理掉。

  • 优点:不必考虑内存碎片问题;效率高。
  • 缺点:可用容量减少为原来的一半,比较浪费。

【最优设置】:根据权威数据分析,90%的对象都是朝生夕死的,所以采用10%的空间用作交换区,因为交换区必须要有等量的两个,所以采用复制算法中新生代中三个区默认分配比例为8:1:1。

2.2 新生代对象的分配和回收

(1)基本上新的对象优先在 Eden 区分配;

(2)当 Eden 区没有足够空间时,会发起一次 Minor GC

(3)Minor GC 回收新生代采用复制回收算法的改进版本,即

  • from 区和 to 区的两个交换区,这两个区只有一个区有数据
  • 采用8:1:1的默认分配比例(**-XX:SurvivorRatio**默认为8,代表 Eden 区与 Survivor 区的大小比例)

2.3 老年代对象的分配和回收

(1)老年代的对象一般来自于新生代中的长期存活对象。这里有一概念叫做年龄阈值,每个对象定义了年龄计数器,经过一次 Minor GC (在交换区)后年龄加1,对象年龄达到_15次后将会晋升到老年代,老年代空间不够时进行 Full GC。当然这个参数仍是可以通过 JVM 参数(-XX:MaxTenuringThreshold_,默认15)来调整。

(2)大对象直接进入老年代。即超过 Eden 区空间,或超过一个参数值(-XX:PretenureSizeThreshold=30m,无默认值)。这样做的目的是避免在Eden区及两个Survivor区之间发生大量的内存复制。

(3)对象提前晋升到老年代(组团)。动态年龄判定:如果在 Survivor 区中相同年龄所有对象大小总和大于 Survivor 区大小的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,而无须等到自己的晋升年龄。

三、JVM完整的GC流程

对象的正常流程:Eden 区 -> Survivor 区 -> 老年代

新生代GC:Minor GC;老年代GC:Full GC,比 Minor GC 慢10倍。

【总结】:内存区域不够用了,就会引发GC,JVM 会“stop the world”,严重影响性能。Minor GC 避免不了,Full GC 尽量避免。

【处理方式】:保存堆栈快照日志、分析内存泄漏、调整内存设置控制垃圾回收频率,选择合适的垃圾回收器等。

JVM原理之完整的一次GC流程相关推荐

  1. JVM的内存结构,Eden和Survivor比例;JVM中一次完整的GC流程,对象如何晋升到老年代,说说你知道的几种主要的JVM参数;CMS 常见参数解析;.你知道哪几种垃圾收集器,各自的优缺点

    47.JVM的内存结构,Eden和Survivor比例 49.JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数 50.-XX:+CMSScavengeBefo ...

  2. JVM原理、调优、GC

    转自:https://www.jianshu.com/p/63fe09fe1a60 jvm原理 Java虚拟机是整个java平台的基石,是java技术实现硬件无关和操作系统无关的关键环节,是java语 ...

  3. Java 虚拟机(JVM)原理介绍

    Java 虚拟机[JVM]原理介绍 1.概述 2.Java类的加载原理机制 2.1 .Java类的加载过程 2.2 .Class loader (类加载器) 2.2.1 类的生命周期 2.2.1.1 ...

  4. JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)

    转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...

  5. JVM原理和调优的理解和学习

    JVM原理和调优的理解和学习 一.详解JVM内存模型 二.JVM中一次完整的GC流程是怎样的 三.GC垃圾回收的算法有哪些 四.简单说说你了解的类加载器 五.双亲委派机制是什么,有什么好处,怎么打破 ...

  6. Java工程师必备:JVM原理、内存模型、调优、垃圾回收机制、面试题

    在如今这个时间和知识都是碎片化的时代,C站根据C1-C4认证的成长路径,进行知识细化整理,形成系统化的知识图谱. 通过调研一线互联网大厂的招聘JD,小编对标C站能力认证要求,为大家整理了系列技术干货合 ...

  7. 面试必问之JVM原理

    1:什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现 ...

  8. jvm原理及性能调优系列(jvm调优)

    jvm原理及性能调优系列(jvm调优) JVM设置: 1.设置合适的最大堆内存(新生代和老生代的最大和值)和最小堆内存(jvm启动时占用的操作系统内存大小),及设置好堆的比例分配. 2.设置合适的新生 ...

  9. JVM原理及调优--网页链接收藏

    此篇用于收藏大神们关于JVM原理及调优通俗易懂的文章链接,用于随时查看 JVM调优总结 JVM参数配置大全 JVM调优:选择合适的GC collector 菜菜鸟想了解下大概的JVM内存模型可以看这个 ...

最新文章

  1. 七年级上册数学计算机教学视频,七年级上册数学视频教学
  2. linux6.2下安装oracle11g,Oracle Linux6.2下安装Oracle11gR2.docx
  3. 数据库空值(Null)小结
  4. b350主板支持cpu列表_惊!AMD旧主板通过这个方法竟也能支持PCIe4.0
  5. 百度地图-矩形编辑的模拟实现
  6. web前端技术分享:管理系统全栈项目之注册功能
  7. boost::python::detail::is_borrowed_ptr相关的测试程序
  8. 大学计算机基础基础部分试题及答案,大学计算机基础试题及答案,等级考网络部分...
  9. SSL 1613——最短路径问题(最短路)
  10. COJS 1752. [BOI2007]摩基亚Mokia
  11. 物联网系统开发如何选择时序数据库
  12. linq 学习日记-select
  13. 静默文件安装安装WebLogic
  14. phpmyadmin创建账号授权指定表
  15. jQuery源码结构
  16. mongovue mysql_mongo客户端mongoVUE的使用
  17. 智能机器人建房子后房价走势_机器人建楼、5G住宅……房地产下半场要这样玩...
  18. 进程ld-linux-x86-64是什么,解决挖矿病毒占用cpu以及误删 ld-linux-x86-64.so.2 文件的问题...
  19. 思维模型 帕累托法则
  20. test failed: The forked VM terminated without saying properly goodbye. VM crash or System.exit

热门文章

  1. 90%的人死在了大学里,只不过八十岁才埋
  2. alphago zero和alpha go、alphago master的区别
  3. [Ubuntu20.04] 没有eth0只有lo和wlo1(没有网卡驱动)
  4. 【毅力挑战】PCIe 每日一问一答(2022.12 已归档)
  5. 使用 Smart Security 实现安全控制
  6. BZOJ 1116: [POI2008]CLO
  7. android 自定义ViewGroup实现仿淘宝的商品详情页
  8. [转]国内地图服务可用性比较
  9. 移动硬盘插到电脑上不显示的解决办法
  10. System.Security.SecurityException Failed to negotiate HTTPS connection with server.fiddler.network