JVM的GC机制和常见GC算法

简介: @[toc]1. 堆内存的分代2. GC分类3. 什么是GC3.1 需要GC的内存区域3.2 GC回收的对象3.3 判断对象存活的两种算法3.3.1 引用计数3.3.2 可达性分析3.4 什么时候触发GC4. 常见的GC算法4.1 标记-清除算法4.2 复制算法4.3 标记-压缩算法

1. 堆内存的分代

堆中内存分为新生代和老年代,其中新生代又分为Eden区、(Survivor)from区、(Survivor)To区


32.png


2. GC分类

新生代垃圾回收器:Minor GC/Young GC

老年代垃圾回收器:Mojor GC/Old GC

整理回收:Full GC(回收堆区和方法区)


3. 什么是GC

垃圾收集(Garbage Collection)通常被称为GC

在程序运行时,内存空间是有限的,那么如何及时的把不再使用的对象清除将内存释放出来,这就是GC要做的事情


3.1 需要GC的内存区域

JVM中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动内存清理,因此内存垃圾回收主要集中于Java堆和方法区,程序运行期间,这部分内存的分配和使用都是动态的


33.png


3.2 GC回收的对象

当一个对象已经没有存活时,GC就会自动对其进行回收

判断对象是否存活有两种方法:引用计数和可达性分析


3.3 判断对象存活的两种算法

3.3.1 引用计数

每一个对象都有一个引用计数属性,新增一个引用时该属性 +1,引用释放时该属性 -1,当该属性为0时代表该对象可以被回收。


这种方法实现简单,缺点也很明显:需要额外的内存来计数、运行时需要维护计数器、无法解决循环引用的问题


3.3.2 可达性分析

  • 基本思路

通过一系列被称为 “ GC Roots ” 的根对象作为起始节点集,从这些结点开始,通过引用关系向下搜索,搜索走过的路径被称为 “ 引用链 ”,如果某个对象到 GC Roots 没有任何引用链相连,就说明该对象不可达,即可被回收

如下图所示,对象4、5、6可被回收


34.png

要想理解可达性分析算法,就得想明白这几个问题:什么是对象可达、GC Roots 是什么、哪些对象可以作为 GC Roots


什么是对象可达


对象可达指的就是双方之间存在直接或间接的引用关系


GC Roots 是什么


GC Roots 就是 JVM 确定当前绝对不会被回收的对象,只要找到这种对象,此对象所依赖的其他对象肯定也不能被回收


哪些对象可被当作 GC Roots


方法区静态属性引用的对象


全局对象的一种,Class 对象本身很难被回收,只要 Class 对象不被回收,静态成员就不能被回收


方法区常量池引用的对象


也属于全局对象,常量本身初始化后不会改变,因此作为 GC Roots 也是合理的


被同步锁持有的对象


被 synchronized 锁住的对象是绝对不能回收的,GC 如果回收了对象,锁不就失效了嘛


3.4 什么时候触发GC

程序调用 System.gc 时触发

系统自身来决定GC触发的时机(根据Eden区和From Space区的内存大小来决定。当内存大小不足时,则会启动GC线程并停止应用线程)

GC又分为 minor GC 和 Full GC (也称为 Major GC )


Minor GC触发条件:当Eden区满时,触发Minor GC。


Full GC触发条件:


a.调用System.gc时,系统建议执行Full GC,但是不必然执行


b.老年代空间不足


c.方法去空间不足


d.通过Minor GC后进入老年代的平均大小大于老年代的可用内存


e.由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小


4. 常见的GC算法

4.1 标记-清除算法

该算法分为标记和清除两个阶段,标记就是把所有活动对象都做上标记的阶段,清除就是将没有做上标记的对象进行回收的阶段


4.2 复制算法

复制算法就是将内存空间按容量分成两块。当这一块内存用完时,就将存活着的对象复制到另一块上面,然后将已经使用过的一块一块清除掉


4.3 标记-压缩算法

标记-压缩算法与标记-清除算法类似,只是后续步骤是让所有存活的对象移动到一端,然后清除掉端边界以外的内存。


目录
相关文章
|
5月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
129 2
|
5月前
|
Java 关系型数据库 MySQL
JVM深入原理(六)(二):双亲委派机制
自定义类加载器打破双亲委派机制的方法:复写ClassLoader中的loadClass方法常见问题:要加载的类名如果是以java.开头,则会抛出安全性异常加载自定义的类都会有一个共同的父类Object,需要在代码中交由父类加载器去加载自定义类加载器不手动指定parent会默认指定应用类加载两个自定义类加载器加载同一个类会被认为是两个对象,只有相同的类加载器+想通的类限定名才会被认为是一个对象。
211 0
|
7月前
|
监控 算法 Java
JVM—垃圾收集算法和HotSpot算法实现细节
JVM的垃圾收集算法和HotSpot的实现细节复杂但至关重要,通过理解和掌握这些算法,可以为Java应用程序选择合适的垃圾收集器,并进行有效的性能调优。选择适当的垃圾收集策略,结合合理的内存配置和日志分析,能够显著提升应用的运行效率和稳定性。
128 15
|
7月前
|
存储 监控 算法
基于 PHP 二叉搜索树算法的内网行为管理机制探究
在当今数字化网络环境中,内网行为管理对于企业网络安全及高效运营具有至关重要的意义。它涵盖对企业内部网络中各类行为的监测、分析与管控。在内网行为管理技术体系里,算法与数据结构扮演着核心角色。本文将深入探究 PHP 语言中的二叉搜索树算法于内网行为管理中的应用。
80 4
|
6月前
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
118 0
|
8月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
135 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
10月前
|
算法 网络协议 Java
【JVM】——GC垃圾回收机制(图解通俗易懂)
GC垃圾回收,标识出垃圾(计数机制、可达性分析)内存释放机制(标记清除、复制算法、标记整理、分代回收)
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
596 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
11月前
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
1119 3

热门文章

最新文章