JVM详解(4)--GC

JVM内存模型、GC机制及原理详解 Java虚拟机(JVM)内存模型是Java程序运行时的核心架构,它定义了程序运行时数据的存储和管理方式。JVM内存主要分为以下几个区域:垃圾对象判定算法:JVM内存模型和GC机制是Java高效运行的基础。理解这些原理有助于:随着Java发展,GC技术也在不断进步,从早期的Serial收集器到现在的ZGC、Shenandoah等低延迟收集器,开发者有了更多选择来满足不同应用场景的需求。 阅读详情

一、GC四大算法

1.GC算法总体概述
jvm在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的是指新生代。因此GC按照回收的区域又分了两种类型,一种是普通GC(minor GC),一种是全局GC(major GC or Full GC)。
Minor GC和Full GC的区别
普通GC(minor GC):只针对新生代区域的GC,指发生在新生代的垃圾回收,因为大多数java对象存活率都不高,所以Minor GC非常的频繁,一般回收速度也比较快。
全局GC(major GC or Full GC):指发生在老年代的垃圾回收,出现了major GC,经常会伴随至少一次的Minor1 GC(但并不是绝对的)。Major GC的速度一般要比Minor GC慢上10倍以上。

2.四大算法

(1)引用计数法
如果说GC开始一个对象有三处地方引用,每引用一处就加一个一,每减少一次引用就减个一,如果减到零,说明别的地方没有引用这个对象,然后GC就开始回收这个对象。
缺点:
1.每次对对象赋值时均要维护引用计数器,且计数器本身也有一定消耗。
2.较难处理循环引用。

(2)复制算法(copying)
年轻代使用的是Minor GC,这种GC算法采用的是复制算法(copying)。
原理:
Minor GC会把Eden中所有活的对象都移到Survivor区域中,如果Survivor区中放不下,那么剩下的活的对象被移到Old generation中,也即一旦收集后,Eden是就变成空的了。
当对象在Eden(包括一个Survivor区域,这里假设是from区域)出生后,在经过一个MinorGC后,如果对象还存在,并且能够被另一块Survivor区域所容纳(上面已经假设为from区域,这里应为to区域,即to区域有足够的内存空间来存储Eden和from区域中存活的对象),则使用复制算法将这些仍然还存活的对象复制到另外一块Survivor区域(即to区域)中,然后清理所使用过的Eden以及Survivor区域(即from区域),并且将这些对象的年龄设置为1,以后对象在survivor区域没熬过一次Minor GC,就将对象的年龄+1,当对象的年龄达到某个值时(默认时15岁,通过-XX:MaxTenuringTheshold来设定参数),这些对象就会成为老年代。
优点:没有内存碎片。
缺点:
1.比较耗费内存。
2.如果对象的存活率很高,我们可以极端一点,假设100%存活,那么我们将需要将所有对象都复制一遍,并将所有地址重置一变遍。复制这一工作所花费的时间,在对象存活率达到一定程度时,将变的不可忽略。所有从以上描述不难看出,复制算法要想使用,最起码对象的存活率要非常低才行,而且最重要的是,我们必须要克服50%内存的浪费。

(3)标记清除(Mark-Sweep)
老年代一般是由标记清除或者标记清除与标记压缩的混合实现。
原理:
算法分成标记和清除两个阶段,先标记出要回收的对象,然后统一回收这些对象,如下图:
在这里插入图片描述
优点:不需要额外空间。
缺点:
1.首先,它的缺点就是效率比较低(递归与全堆对象遍历),而且在进行GC的时候,需要停止应用程序,这导致用户体验非常的差。
2.其次,主要的缺点则是这种方式清理出来的空间内存是不连续的,这点不难理解,我们的死亡对象都是随机的出现在内存的各个角落的,现在把他们清除之后,内存的布局自然会乱七八糟。而为了应对这一点,jvm就不得不维持一个内存的空闲列表,这又是一种开销。呃去在分配数组对象的时候,寻找连续的内存空间不太好找。

(4)标记压缩(Mark-Compact)
老年代一般是由标记清除或者标记清除与标记压缩的混合实现。
原理:
1.标记
在这里插入图片描述
2.清除
在这里插入图片描述
3.压缩
在这里插入图片描述
优点:没有内存碎片。
缺点:需要移动存活对象,耗时严重。

二、小总结

内存效率:复制算法>标记清除算法>标记压缩算法(此处的效率只是简单的对比时间复杂度,实际情况不一定如此)。
内存整齐度:复制算法=标记压缩算法>标记清除算法。
内存利用率:标记压缩算法=标记清除算法>复制算法。
可以看出,效率上来说,复制算法是当之无愧的老大,但是浪费了太多的内存,而为了尽量兼管上面所提到的三个指标,标记压缩算法相对来说平滑一点,但效率上依旧不如人意,它比复制算法多了一个标记节点,又比标记清理多了一个整理内存的过程。

聊透minorGC-JVM GC机制详解 >JAVA后端圈内流传着一句话,JVM调优是可以看作评价一位Java程序员内功的标准。 >说到JVM调优,有些参数的调整对线上项目是真有用,比如我这篇文章谈的;有些可能就是为了调而调了,不如把Java用Golang写一遍,数据非常好看。 ---- 阅读详情

相关推荐

JVM的GC策略

1 前言      GC(Garbage Collect)是jvm对于内存管理的核心功能,正是因为它才让java程序员从内存释放的苦海中脱离出来,所以作为一个程序员都有必要去了解一下他的原理。        说一句题外话,我曾经被问到GC的具体实现,那个时候我就知道一些基本的思想,结果被人鄙视了。对于这个问题我到现在仍保留个人观点,就算java用了很久,如果不涉及到java程序的性能调

一个人的博客 6262

JVM的gcc过程简介

JVM在内存溢出时会自动进行垃圾回收,JVM中的堆分为新生代、老年代和永久代三部分。

qq_42411696的博客 150

jvm性能调优 - 22JVM GC回顾

前面二十几篇分析了JVM的核心运行原理,还有JVM GC的工作原理 同时,结合案例分析了JVM什么情况下会出现GC的问题,平时我们说优化JVM,到底是在说优化JVM的什么东西 。 这里我们来总结一下

小工匠 2万+

GC四大算法详解

GC垃圾回收的四大算法详解:复制算法,标记清除算法,标记压缩算法,分代收集算法。参考文章:https://www.jianshu.com/p/9e6841a895b4

AtlantisChina 7175

JVM的三种常见GC:Minor GC、Major GC与Full GC

其实不分代完全可以,分代的唯一理由就是优化GC性能,如果没有分代,那所有的对象都在一个区域,当需要进行GC的时候就需要把所有的对象都进行遍历,GC的时候会暂停用户线程,那么这样的话,就非常消耗性能,然而大部分对象都是朝生夕死的,何不把活得久的朝生夕死的对象进行分代呢,这样的话,只需要对这些朝生夕死的对象进行回收就行了.总之,容易死的区域频繁回收,不容易死的区域减少回收.顾名思义,在新生代中,每次垃圾收集时都发现有大批对象死去,而每次回收后存活的少量对象,将会逐步晋升到老年代中存放。...

流楚丶格念的博客 1万+

Seafile搭建以及onlyoffice在线办公

部署seafile docker-compose.yml 如下: 参考此篇文章 version: '2.0' services: db: image: mariadb:10.1 container_name: seafile-mysql environment: - MYSQL_ROOT_PASSWORD=db_dev # mysql root的密码,同时修改 seafile的DB_ROOT_PASSWD与这个一致 - MYSQL_LOG_CONSOLE

dwdcth的专栏 4656

GC四大算法

目录 什么是GC GC四大算法 前奏: 可达性分析 什么是大对象: 方法区如何判断是否需要回收 正文 引用计数法(JVM一般不采取这种算法) 复制算法(copying)(年轻代使用) 标记-清除算法(Mark-Sweep)(老年代使用) 标记整理算法(Mark-Compact)(老年代使用) 标记-清除-压缩(Mark-Sweep(标记清除算法)+Mark-C...

小白鼠丶 2794

STM32双ADC同步采样实战:FFT测量相位差的5个关键细节

本文深入探讨了利用STM32双ADC同步采样结合FFT算法精确测量信号相位差的实战技巧。文章聚焦五个关键细节:确保ADC时钟同源、优化DMA缓冲区设计、信号调理与窗函数选择、精确的相位提取与解缠绕,以及系统误差校准与验证。这些细节是提升相位差测量精度、确保系统稳定性的核心,尤其强调了STM32配置中易被忽视的时钟同步问题。

oauth7security的博客 595

GC 四大算法:引用计数算法、复制算法、标记清除算法、标记压缩清除算法 。GC:分代收集算法

1、引用计数算法(JVM基本不用)2、复制算法(一般在新生区使用)3、标记清除算法4、标记压缩算法(老年代使用)总结 1、引用计数算法(JVM基本不用) 每个对象都占用一个计数器,每用一次,计数器加一,计数器为0的清除。 2、复制算法(一般在新生区使用) 注意:因为from和to会进行交换,所以哪个为空那个就是to区 在伊甸园区不断生成对象,当满了的时候会出发轻GC,将存活的对象从伊甸园区复制到幸存from区,然后清空伊甸园区,在幸存from区满了后会将伊甸园区和幸存from区都复制到幸存to区,然后.

LongKai_G 1024

【WRF-CMAQ实战指南】从环境配置到测试案例运行全解析

本文详细解析了WRF-CMAQ从环境配置到测试案例运行的全过程,包括系统环境检查、依赖库安装、源码获取与项目初始化、关键配置技巧、编译实战与排错、测试案例运行验证等关键步骤。通过实战指南,帮助用户快速掌握WRF-CMAQ的安装和运行技巧,提升空气质量模拟的效率。

year5的博客 244

出现 Error occurred during initialization of VMagent library failed Agent OnLoad 解决方法

ntelliJ IDEA启动时出现"Agent library failed to load"错误,主要原因是JVM代理加载失败。解决方法包括:1)完全卸载并删除用户目录下的JetBrains配置文件;2)检查并修改idea64.exe.vmoptions文件,确保路径正确并删除不必要的-javaagent参数;

码农研究僧的博客 2484

gc四种算法

gc四种算法

醉代码的博客 1349

知识图谱设计简记

知识图谱是一种语义化的知识表示框架,通过实体-关系-属性三元组形式表达现实世界关联。其核心价值在于关联化整合数据、支持可解释性推理和赋能智能化应用。知识图谱可分为通用型和领域型两类,基本构成包括实体、关系、属性等基础元素,以及本体和实例等架构层元素。设计方法主要有自上而下、自下而上和混合式三种,需遵循业务导向、一致性等原则。在建模时需要明确属性与实体的判断标准,规范处理关系的方向性与对称性,并合理构建多重关系。主流技术框架如RDF和属性图体系均支持多重关系建模,选择需考虑业务需求。本体作为知识图谱的概念骨架

生活在别处 360

终极指南:如何使用GCViewer精准分析JVM安全点与GC暂停的关键区别

GCViewer是一款强大的Java垃圾回收日志分析工具,能够帮助开发者深入理解JVM的内存管理机制。本文将通过实际案例和操作指南,教你如何利用GCViewer区分VM操作暂停与GC暂停,优化Java应用性能。 ## 什么是JVM安全点?为何它对性能至关重要? 安全点(Safepoint)是JVM中一个特殊的执行状态,所有线程在此刻会暂停执行,以便JVM进行特定操作。常见的安全点操作包括: -

gitblog_00512的博客 1017

芒果YOLOv5改进55:损失函数篇之KLD:即插即用 芒果首发原创新颖|全网唯一更新KLD改进博客,通过 Kullback-Leibler 散度学习用于目标检测的高精度边界框,提升YOLOv5小目标

YOLOv5改进KLD损失函数:即插即用 原创新颖|芒果专栏独家首发

包括YOLOv5、YOLOv7、YOLOv8等模型改进 664

【AI Agent系列】【阿里AgentScope框架】0. 快速上手:AgentScope框架简介与你的第一个AgentScope程序

这是我们学习的第四款智能体框架了。前面我们学习了 AutoGPT、MetaGPT、LangGraph 等智能体应用开发框架,各有优缺点。今天我们开始学习AgentScope这一款多智能体开发框架。卷起来吧,多看看,多用用,没坏处。

同学小张的博客 5425

JVM结构、GC工作机制详解

外话:最近在应聘阿里2015暑期实习,感触颇多。机会总是留给有准备的人的,所以平常一定要注意知识的巩固和积累。知识的深度也要有一定的理解,不比别人知道的多,公司干嘛选你?关于JVM和GC,我相信学Java的绝大部分人都听过,很多公司的面试官都爱问,一开始我也很头痛,问这么底层干什么,所以我每次面试也只是看看答案敷衍了事。最近面完阿里感觉真不能这样,知识不仅要知其然,还要知其所以然。其实弄懂了JVM

Thancks 7万+

第4章-07-将WebDriver获取的Cookie传递给Requests

在使用Selenium WebDriver获取了浏览器的Cookies之后,你可以将这些Cookies传递给requests库,以便在后续的HTTP请求中使用这些Cookies。这样做可以让你模拟浏览器会话,使得请求看起来像是从之前使用Selenium WebDriver控制的浏览器发出的。

黑夜开发者的博客 692

JVM一次完整GC流程详解

jvm一次完整的GC流程

zhiyuanIT的专栏 1266

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JVM GC 日志详解 --打印GC日志

本文采用的JDK版本: java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode) 一、GC 日志参数 设置JVM GC格式日志的主要参数包括如下8个: -X...

yinni11的博客 2万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【JVM】—G1 GC日志详解

G1 有两个阶段,它会在这两个阶段往返,分别是 Young-only,Space Reclamation.Young-only阶段包含一系列逐渐填满老年代Regin的 GC;Space Reclamation 阶段G1会递进地回收老年代Regin的空间,同时也处理新生代Region

一棵灬大树的博客 2557

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JVM的GC详解

我们大体可以看出GC原因是Allocation Failure即新生代不能分配对象,触发一次新生代GC,新生代GC前后空间由3348K变为512K,整堆空间由3348K变为1692K,最后输出了GC耗时、系统响应耗时以及应用程序暂停时间。执行第二行代码bytes = new byte[1024 * 1024];再次进程内存分配时,发现新生代空间不足出现以此minor gc,对应输出结果如下,首先代码执行到byte[] bytes = new byte[1024 * 1024];获取GC日志方式大抵有两种。

我的博客 1964

【JVM】—G1中的Young GC、Mixed GC、Full GC详解

G1提供了两种GC模式,Young GC和Mixed GC,两种都是完全Stop The World的。 Young GC:选定所有年轻代里的Region。通过控制年轻代的region个数,即年轻代内存大小,来控制young GC的时间开销。 Mixed GC:选定所有年轻代里的Region,外加根据Global concurrent marking统计得出收集收益高的若干老年代Region。在用户指定的开销目标范围内尽可能选择收益高的老年代Region。

一棵灬大树的博客 3641

JVM(五)Parallel GC,CMS GC,G1 GC详解

本文详细介绍了JVM中的几种常见GC算法及其实现,包括串行GC、并行GC、CMS垃圾收集器和G1垃圾收集器。串行GC是单线程的,适合小规模应用,而并行GC通过多线程提高吞吐量,但可能导致长时间停顿。CMS GC旨在减少老年代回收时的停顿,通过并发标记和清除阶段减少STW时间,但可能产生内存碎片。G1 GC的目标是实现可预期的停顿时间,通过将堆划分为多个小块并优先回收垃圾最多的区域,G1在并发阶段估算存活对象并执行增量回收,减少停顿时间。G1还引入了Remembered Sets来优化独立回收。

m0_58466443的博客 3849

JVM中GC原理解析

一、在理解GC之前,先了解下JVM体系结构   1.1什么是GC GC可以理解为在追踪仍然使用的所有对象,并将其余对象标记为垃圾然后进行回收,这样的一个过程称之为GC,所有的GC系统可以从如下几个方面进行实现 1.GC判断策略(例如引用计数,对象可达) 2.GC收集算法(标记清除法,标记清除整理法,标记复制清除法,分带法) 3.GC收集器(例如Serial,Parallel,CMS...

weixin_42415158的博客 7826

JVM 垃圾回收 GC详解

1. GC概述 1.1 GC(Garbage Collection)是JVM的核心组件,它在JVM中以单独的线程(daemon thread)运行,作用于内存堆区域(Stack Space),扫描那些经过new关键字创建的无用的对象并清除以释放内存,必要时整理内存。 只作用于堆区域吗? 也会扫描方法区(永久代) 只处理经过new关键字创建的对象吗? 也会处理无用常量和无用类...

上善若水 4714
上一篇: JVM详解(3)--堆参数调优入门
下一篇: 队列说明及代码实现
suixinghero
博客等级 码龄7年 10粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值