JVM学习--(二)垃圾收集器与内存分配策略

【JVM】总结(二)——垃圾收集器与内存分配策略 一、垃圾收集器 英文名是GC,即Garbage Collection。 1、哪些内存需要回收? Java堆和方法区需要回收。 上篇博客我们说到运行时区域分为程序计数器、虚拟机栈、本地方法栈、Java堆和方法区。其中程序计数器、虚拟机栈、本地方法栈这三个区域是随线程而生,随线程而灭。在方法结束或者线程结束时,内存自然就跟随回收了。而Java堆和方法区则不一样,一个接口中的多个实现类需要的内存... 阅读详情

垃圾收集器与内存分配策略

垃圾回收主要完成了三件事情:确定哪些垃圾需要回收,什么时候进行回收以及如何把垃圾回收。此篇仅针对JAVA堆的垃圾回收。

一.哪些垃圾需要回收(判断对象已死)

1.是否存活算法:

1️⃣引用计数算法:如果引用则加1,任何时候都没有引用则为0,这时候虚拟机就可以将它回收。致命缺点:容易存在循环引用,引起内存泄漏。
2️⃣可达性分析算法:以GC ROOTS为起点进行遍历,如果对象可达则表明不可以回收,否则可以被垃圾回收器回收。

2.引用的种类:

可达性分析的基础是通过对象之间的引用关系进行遍历,但是这种引用显得太刻板,因此有了以下几种引用:
1️⃣强引用:无论任何情况下,垃圾收集器都不会回收掉这类引用。
2️⃣软引用:当内存快溢出时,收集器会将其回收。
3️⃣弱引用:引用对象只能存活到下次垃圾回收。
4️⃣虚引用:唯一目的是为了垃圾回收时收到一个系统通知。

3.死亡的过程

若被收集器判断为不可达,那么这个对象并不是非死不可的。若对象重写了finalize()方法,并且方法中又重新建立连接,那么这个对象会获得自救。然而这种自救方式只有一次机会,第二次收集器将会直接将其判断为死亡。

4.方法区的回收

方法区的回收内容:废弃的常量以及不再使用的类型。回收条件十分苛刻,因此回收性价比很低。

二.垃圾收集算法

以下均为追踪式垃圾收集的范畴。

1.分代收集理论

理论基础:1️⃣弱分代假说,意思是绝大多数的对象都是朝生夕死的。2️⃣强分代假说,意思是熬过越多次的垃圾收集那么这个对象是越难消亡的。3️⃣跨代引用相对于同代引用是数量少很多的。一般通过在新生代的基础上增加一个全局数据结构(记忆集)来实现跨代的引用。

2.三种基本的算法

1️⃣标记-清除算法。将需要回收的对象标记后回收。缺点:1.执行效率不稳定,如果需要回收的对象多,需要的动作很多。2.内存的碎片很多,大对象不容易找到连续的内存来存储。
2️⃣标记-复制算法。将对象后标记后复制到新的半区。特点:1.解决了第一种方法的效率问题,因为第一种是标记需要回收的,而这种方法是标记不需要回收的,在新生代需要回收的对象大大多于不需要回收的。2.解决了碎片问题。3.缺点是需要留出额外的内存空间来进行复制操作。
*当存活区内存不够的时候,可以通过分配担保机制将对象直接进入老年代。
3️⃣标记-整理算法。
对于老年代经常采用的一种移动式算法。特点:1.移动对象的时候需要更新引用,会引起stw。2.不会产生内存碎片。

三.Hotspot算法实现细节

1.根节点的枚举

任何垃圾回收器在GC Roots枚举的时候都需要STW,但可以缩短这个时间,其中一种方法是使用一组叫做OopMap的数据结构来达到这个目的,会在特定的位置记录下栈里和寄存器中哪些位置是引用,缩短扫描的时间。

2.安全点

每个点都创建oopmap性价比很低,因此只会在特点位置生成oopmap,这些位置就被称为安全点。选取的标准是“是否具有让程序长时间执行的特征”。另外一个问题是要保证所有线程都跑到最近的安全点,主要选择有:抢先式中断和主动式中断。抢先式指的是当垃圾收集发生时,如果线程没有跑到安全点则让它恢复跑到安全点后再暂停,而主动式指的是线程在运行的过程中不断询问当前位置是否是安全点,若是则停下来。

3.安全区域

由于线程可能sleep或者blocked,这时候线程便无法响应虚拟机中的请求,不能走到安全的位置挂起自己。因此需要安全区域,可以看做是一段延长的安全点,在这个区域内任意位置开始垃圾收集都是安全的。

4.记忆集与卡表

记忆集主要解决了对象跨代引用带来的问题,主要选择的精度有:字长精度、对象精度和卡精度。而卡精度常常被称作卡表,每条记录都精确到一块内存区域,每个内存块被称作“卡页”,只要卡页中其中一个对象具有跨代引用,那么它就是dirty的,就需要加入GC roots一起扫描。

5.写屏障

hotspot虚拟机可以通过写屏障来维护卡表,相当于aop,在每次赋值操作的时候更新卡表,为了防止伪贡献问题的产生,可以每次都判断卡表需不需要更新。

6.并发的可达性分析

一般用三种颜色来表示对象的可达状态:1️⃣白色:说明没有被访问过,若分析结束还是白色就会被回收。2️⃣灰色:对象已经被访问过,但至少还存在一个引用没有被访问。3️⃣黑色:被访问过,且所有引用已经被引用。
如果在可达性分析的同时并发会发生两个问题:
1️⃣原来消亡的对象被标记为存活,关系不大,只是产生浮动垃圾,下次再收集即可。
2️⃣对象消失,会导致程序崩溃。只有同时满足两个条件才会发生:1.插入了一条黑色到白色的引用(增量更新解决) 2.删除了全部从灰色对象到白色对象的引用(原始快照SATB解决)。

四.经典的垃圾收集器

在这里插入图片描述

1.新生代

①Serial垃圾收集器

线程数:单线程。强调的是当垃圾回收时其他的线程必须停止。
算法:标记-复制算法。
-XX:+UseSerialGC 是指新生代用Serial 老年代用SerialOld

②ParNew收集器

线程数:多线程。强调可以采用多线程进行并行,但是不能并发。
算法:标记-复制算法。
** 与CMS配合一度非常流行,但CMS被淘汰后,ParNew也被淘汰。
—XX:+UseParNewGC 是指新生代用ParNew,老年代用CMS。

③Parallel Scavenge收集器

线程数:多线程。强调的是吞吐量,也是不能并发。
算法:标记-复制算法。
可以通过-XX:MaxGCPauseMillis以及-XX:GCTimeRatio来设置,也可以通过-XX:+UseAdaptiveSizePolicy来自动设置。

2.老年代

①Serial Old收集器

线程:单线程
算法:标记-整理算法。
用途:主要和Parallel Scavenge搭配使用,作为CMS的预备方案。

②Parallel Old收集器

线程:多线程
算法:标记-整理算法。
用途:与Parallel Scavenge配合构成一个吞吐量优先的组合。

③CMS收集器

目标:获得最短回收停顿。
线程:多线程并发收集。
算法:标记清除算法。
流程:
1️⃣初始标记。根据GC Roots标记直接关联到的对象,此过程需要STW。
2️⃣并发标记。遍历所有对象,这过程可以与用户线程并发。
3️⃣重新标记。根据“增量更新”对于那些白色对象进行重新标记。此过程也需要STW。
4️⃣并发清理。对于那些需要回收的对象进行清理。
缺点:
1️⃣并发时需要默认启动(处理器核心数目+3)/4的线程数专门来进行垃圾回收,影响服务器效率。
2️⃣并发过程中产生的浮动垃圾需要下次垃圾回收时再处理,因此需要留出额外的空间给浮动垃圾,而如果超过阈值,会触发SerialOld收集器进行回收。
3️⃣空间碎片多。

3.不分代

①G1收集器

JDK9之后G1收集器正式成为了默认垃圾收集器。整体采用标记-整理算法。
同时注重了吞吐量和低延迟。采用了Mixed GC没有了代之间的概念。
将JAVA堆分成多个大小相同的Region,每个region可以扮演Eden区、Survivor空间或者老年代空间。
若大对象的大小大于一个Region容量一半时,会被存放在N个连续的Humongous Region中,G1将其当做老年代看待。

Ⅰ预测停顿时间

G1将每个Region作为最小的回收单位,让G1去跟踪每个Region回收的价值,根据设定的收集停顿时间优先回收那些回收价值大的。

Ⅱ已经解决的那些关键问题

1️⃣Region之间互相引用问题。每个Region各自维护指向自己的指针,需要JAVA堆中的10%-20%来维持这种操作。
2️⃣并发时如何保证收集线程和用户线程互不干扰。采用原始快照SATB。
3️⃣如何建立可靠的停顿模型。以衰减均值为理论基础来实现,根据脏卡数量等各种统计数据来估计平均时间,但新数据所占的权重大。

Ⅲ 过程

1️⃣初始标记。标记可以被GC Roots可以直接访问到的对象,并且修改TAMS指针的值。
2️⃣并发标记。进行可达性分析,并且重新标记SATB记录下的对象。
3️⃣最终标记。STW一小段时间,处理结束时的那一小段的SATB记录。
4️⃣筛选回收。根据回收成本进行筛选回收。需要STW。

Ⅳ 特点

1️⃣内存连续,便于存放大对象。
2️⃣卡表复杂,所占用内存大。
3️⃣不但需要写前屏障也需要写后屏障,消耗更多的运算资源。
4️⃣小内存使用CMS更好,大内存使用G1更好。平衡点在6GB到8GB之间。

②低延迟收集器

目前仍然处在实验阶段。

1.Shenandoah收集器

回收阶段也支持多线程并发。摒弃了记忆集,使用连接矩阵来解决跨代引用问题。停顿时间减少很多,但是吞吐量也减少很多。
过程:
①初始标记。
②并发标记。
③最终标记。完成剩下的SATB,统计出回收价值最大的Region,将这些Region放入回收集,会有一小段STW。
④并发清理。清理那些没有一个存活对象的区域。
⑤并发回收。将回收集中的存活对象复制到未被使用的Region中去,由于是并发的,引用都需要改变,这里使用了读屏障“Brooks Pointers”转发指针。
⑥初始引用更新。复制完后需要将旧引用改成新的引用,但这个阶段只是个开始信号,没有什么实际作用,有个很小的STW。
⑦并发引用更新。正式开始引用更新操作。
⑧最终引用更新。改正GC Roots的引用,有个小的STW。
⑨并发清理。将回收集清空。

Brooks Pointers:在原来的对象布局结构的最前面统一加上新的引用,没移动前是指向自己,移动后指向新的引用。由于与用户线程并发,使用的时候必须用户线程和收集器线程对于复制对象的操作需要CAS。
BrooksPointers的使用使得在访问对象的同时需要有读屏障,这开销代价很大。

2.ZGC收集器

一款采用Region内存分布,不设分代,使用了读屏障,染色指针和内存多重映射技术来实现的标记整理算法。
特点:
1️⃣动态内存,有小Region,中Region以及大Region。
2️⃣染色指针技术。解决了并发整理问题,将内存中的高四位作为引用标记。优点:
①若Region存活的对象被移走,那么Region可以直接被释放。也被称为自愈。
②减少了内存屏障的使用,可以直接将这些内容维护在指针内。
③未来可以扩展更多的位数来储存更多的标志。
过程:所有过程都可以并发操作,仅仅存在两个小停顿。
1️⃣并发标记。可达性分析,是在指针上进行的。
2️⃣并发预备重分配。统计出需要清理哪些Region,但是是会扫描所有的Region,生成重分配集。
3️⃣并发重分配。把重分配集中的对象复制到新的Region上,为每个重分配集中的Region维护一个转发表,由于有染色指针的支持,可以很快知道一个对象是否处在重分配集当中,如果是,那么在第一次访问的时候会根据转发表访问新对象,并将引用指向新对象,这样就只在第一次访问的时候降低了访问的速度。
4️⃣并发重分配。修正整个堆中指向重分配集中旧对象的所有引用。这个过程不是必须的,因此经常跟下次的并发标记一起进行。

内存淘汰机制与算法 在本文开始之前,我们先要明白:在 Redis 中,过期策略和内存淘汰策略两个完全不同的概念,但很多人会把两者搞混。 首先,Redis 过期策略指的是 Redis 使用那种策略,来删除已经过期的键值对;而 Redis 内存淘汰机制指的是,当 Redis 运行内存已经超过 Redis 设置的最大内存之后,将采用什么策略来删除符合条件的键值对,以此来保障 Redis 高效的运行。 过期策略前面的文章,我... 阅读详情

相关推荐

COMSOL电磁仿真案例——感应线圈

COMSOL电磁建模仿真案例——感应线圈

冲击10w 6万+

JVM——垃圾回收机制

一、判断对象是否是垃圾 1、引用计数法 GC线程不定时回收时,如果对象被引用的话,年龄会加1,被回收掉一个对象就会减去1,当年龄为0岁,就会被垃圾回收机制认为是不可达对象,会被清理。 循环依赖问题:有两个对象A和B,当A = B;B = A ; A = null; B = null; 此时这两个对象就不知道到底为不为0,导致对象无法被回收。该方法已被淘汰。 2、可达性分析(根搜索法(GC Roots)) 由GC Root出发,开始寻找,看看某...

hyWang94 261

零基础手把手教你做FMEDA

本文通过分步骤手把手来教大家具体如何做FMEDA,希望对工作中要做FMEDA的童鞋有帮助。对于工作当中用不到FMEDA的童鞋,也可以作为科普知识,更好地了解一下FMEDA及硬件功能安全。

NewCarRen的博客 9929

干货丨缓存的淘汰策略有几种?分别怎么用?

缓存是指,将一些需要读取数据放在磁盘或者内存中,由于追求速度从而一般是放在内存中。缓存容量有限,若缓存满了系统是如何淘汰一些数据的呢?使用了缓存后因缓存的容量有限,等缓存满了之后需要淘汰一些数据,如Map数据结构是一个思路,我们自己的电脑存储文件或者是和JVM存储对象一样,内存不是无限的。因此在实现缓存时必须要设计一套缓存淘汰策略,按照某种机制回收缓存占用的内存,保证缓存...

传智播客的专栏 624

微带功分器设计与ADS-EM联合仿真实战解析

本文详细解析了微带功分器设计与ADS-EM联合仿真的实战技巧,涵盖特性阻抗计算、ADS原理图设计、版图生成与EM仿真等关键步骤。通过实际案例分享,帮助工程师掌握射频电路设计中的核心技术和调试方法,提升功分器设计效率与性能。

weixin_29280219的博客 451

2026闲鱼数据采集实战:本地YOLO识别滑块验证码+接口签名分析+零成本价格监控系统

2026闲鱼反爬系统升级实战:零成本解决方案 本文针对2026年闲鱼最新反爬机制提出了一套完整的零成本解决方案。系统面临四大挑战:AI滑块验证、接口签名升级、设备指纹绑定和精细化行为检测。通过以下技术突破实现稳定运行: 本地化AI破解:训练YOLOv11n模型实现98%准确率的滑块识别,替代付费打码平台 逆向工程:Hook闲鱼App签名算法,用Python重写HMAC-SHA256签名生成器 设备指纹管理:建立"一机一号一IP"机制,维护50+种设备特征 行为模拟:开发四阶段滑动轨迹模型

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1456

JVM---如何判断对象为垃圾、回收策略、收集器、内存分配、引用

一、如何判断对象为垃圾 1)引用计数算法(已淘汰): 原理: 对象中存在一个引用计数器 对象被引用时,计数器+1; 引用失效时,计数器-1 计数器为0时,对象被回收 淘汰原因:无法解决对象间相互引用的问题。 当外界不访问A,B两个对象,且对象A,B相互引用时,计数器不为0,则无法回收 2)可达性分析算法: 思想: 定义GC Root作为引用链起点,向下搜索。 被搜索到的节点对象判定...

一万年行不行的博客 508

(保姆教程)Spyder 配置Tensorflow(2.5.0)和keras(2.4.3)

(保姆教程)Spyder 配置Tensorflow(2.5.0)和keras(2.4.3)

qq_43102225的博客 1万+

Redis过期策略和内存淘汰机制

Redis缓存作为提高系统性能最好的方式相信大家对其一定不陌生,各位作为秃头老码农不仅需要掌握Redis的基础用法还得了解Redis的相关原理,比如Redis过期策略和内存淘汰机制。大家都知道,Redis缓存使用的是内存资源,虽然缓存服务器会配置比较高的内存资源,但如果对于Redis中的缓存数据我们不管不顾,内存资源总有耗尽的时候,这时缓存服务器就无法再对外提供服务了。我们要用有限的服务器资源支撑...

十指波课堂的博客 297

【校招】SHL 的 General Ability (GA, 通用能力测试)

SHL 的 General Ability (GA, 通用能力测试) 文章目录SHL 的 General Ability (GA, 通用能力测试)1、归纳推理题1.1 圈圈线条推理1.2 图形颜色位置推理1.3 箭头指向推理2. 数字推理题攻略3. 语言推理题 1、归纳推理题   归纳推理题我把它总结为三种类型:圈圈线条推理;图形颜色位置推理;箭头指向推理。 1.1 圈圈线条推理   你别看这个题目看起来很复杂,其实很简单,而且这个题型的题目背后原理都一样!我把我的 tips 偷偷分享给你们嘿嘿~先从 A

Sunnyside_ 2万+

openharmony之启动恢复子系统详解

需求: 添加一个名为my_service的自定义服务步骤1: 创建服务配置],],"env": [步骤2: 添加到主配置],"jobs": ["cmds": [步骤3: 验证配置# ✅ 检查配置格式 jq . /system/etc/init/my_service.cfg # 🔄 重新加载配置 begetctl reload # 📊 验证服务状态 begetctl dump_service my_serviceOpenHarmony init进程的完整生命周期。🔄 三阶段启动模型⚙️ 配置体系。

m0_67505153的博客 601

JVM学习二 垃圾收集器与内存分配策略

一如何判断无效对象需要回收 1.引用计数法:每一个对象都有一个计数器,当这个对象被一个变量或者另一个对象引用一次,计数器加一,若引用失效,计数器减一,如果计数器为0则认为该对象为无效对象(无法识别对象循环引用) 2.可达性分析法:所有和GC Root直接或间接关联的对象都是有效对象,和GC Root没有关联的对象就是无效对象 GC Root是指 a.java虚拟机栈所引用的对象(栈帧中局...

Jon_jing的博客 233

【表面缺陷检测】基于yolov5的钢轨表面缺陷检测(附代码和数据集,Windows系统)

【表面缺陷检测】基于yolov5的钢轨表面缺陷检测(附代码和数据集,Windows系统)

学无止境、积少成多、厚积薄发 3984

JVM学习笔记(二)—— 垃圾收集器与内存分配策略

垃圾收集器与内存分配策略1. 概述2. 对象已死?2.1 引用计数算法2.2 可达性分析算法2.3 再谈引用2.4 finalize()方法是对象逃脱死亡命运的最后一次机会2.5 回收方法区3. 垃圾收集算法3.1 分代收集理论3.2 标记-清除算法3.3 标记-复制算法3.4 标记-整理算法4. HotSpot的算法细节实现4.1 根节点枚举4.2 安全点4.3 安全区域4.4 记忆集与卡表4.5 写屏障4.6并发的可达性分析5. 经典垃圾收集器5.1 Serial 收集器5.2 ParNew 收集器5.

gui__Sir的博客 752

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jvm学习笔记(二)垃圾收集器与内存分配策略

一、对象可回收状态判断 1、引用计数算法 原理:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器值减一。        计数器为0的对象,可以回收。 缺点:难以解决对象之间互相循环引用的问题;两个对象互相引用,但没有其他引用指向这两个对象,这两个对象 已经不可能再被访问,但是它们的引用计数都不为1,通过引用计数法无法通知GC收集器回收它们。 2、可达性...

笨鸟的专栏 256

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【学习笔记】—JVM(二)垃圾收集器和内存分配策略

一、为什么要回收   在上一部分在对每个数据区分析了,最后指出了他会抛出什么异常,最多的就是OOM,内存溢出异常。在Java堆中一个程序要创建太多的实例对象,但有些数据只用了一次之后却再没有使用,如果不将它清除掉,对内存而言永远是不够用的。 二、如何判断对象不再使用,需要清理 1.引用计数法算法 给对象添加一个引用计数器,每当有一个地方引用它时计数器加1,失效时减1;为0时则不会再被使用。 J...

咕噜橙的博客 305

JVM最佳学习笔记<二>---垃圾收集器与内存分配策略

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34129696的博客 124

深入理解java虚拟机学习笔记(二)-jvm垃圾收集器和内存分配策略

#1.垃圾如何确认 对于大多数语言中判断对象是否存活会采用引用计数法:给对象添加一个引用计数器,当有一个地方引用时,计数器就加1,当引用失效时,计数器就减1。任何时刻只要计数器为0则回收。但是这种算法无法解决对象之间互相循环引用的问题。如A引用B,而B又引用A,计数器永远不为0,这两个对象再也无任何引用。这样GC不能回收这两个对象。 因此,在JAVA中,采用了可达性分析算法来解决这个问题,判断对象是否存活。 可达性分析算法:通过GCRoots的对象作为起点,从这些节点向下搜索,搜索走过的路径称之为引用链(R

dhaibo1986的专栏 207

jvm学习小结二----垃圾收集器与内存分配策略

1、堆和方法区需要回收 内存运行时区域有,程序计数器、虚拟机栈、本地方法栈、方法区、堆。其中程序计数器、虚拟机栈、本地方法栈随线程而生,随线程而灭,且栈帧的大小再编译时就已经确定了,因此这几个区域的分配和回收不需要过多考虑。而堆和方法区不一样,比如一个接口中多个实现类需要的内存不一样,一个方法的不同分支需要的内存可能不一样,因此这些内存的分配和回收都是动态的。 2、判断对象存活的算法有引用计数...

千霜的博客 273

JVM——GC策略及经典垃圾收集器

G1把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间,收集器能够对扮演不同角色的 Region采用不同的策略去处理。当对象拥有了一份新的副本时,只需要修改一处指针的值,即旧对象上转发指针的引用位置,使其指向新对象,便可将所有对该对象的访问转发到新的副本上。强引用:传统引用的定义(reference类型的数据中存储的数值代表的是另外一块内存的起始地址), GC永远不会回收被强引用的对象。

weixin_45021712的博客 2146

深入理解JVM垃圾收集器与内存分配策略

在Java虚拟机中,“垃圾”指的是内存中不再使用或不可达的对象。垃圾收集器(GC)的主要任务就是识别并回收这些垃圾对象,释放内存资源。在JVM中,垃圾收集器管理的是堆(Heap)和方法区(Method Area)中的对象,它们的生命周期是动态的,需要在运行时进行分配和回收。JVM的垃圾收集机制通过多种垃圾收集算法和策略来优化内存回收,提升程序性能。理解不同垃圾收集器的特点及内存分配策略,能够帮助开发者更好地管理Java应用的内存,减少垃圾回收带来的性能损耗。

dm菜鸟编程的专栏 1214

深入理解Java虚拟机:Jvm总结-垃圾收集器与内存分配策略

但是会存在跨代引用的情况,即新生代中对象有可能被老年代所引用,实际情况中,存在互相引用的对象是偏向于同时存活或同时消亡的(被老年代引用的对象在收集时会存活下来然后晋升到老年代),根据第三个假说,为了避免检查跨代引用时扫描整个老年代,可以建立一个记忆集,把老年代划分成若干小块并标识出哪块存在跨代引用,在发生新生代收集时,只有包含跨代引用的块会被加入到GC Roots扫描。冒险:把Survivor无法容纳的对象直接送入老年代,前提是老年代有空间容纳这些对象,但不确定被容纳的对象其中有多少能在回收中存活下来。

Oceáno的博客 1822

JVM:常用的垃圾收集器与调优技巧

垃圾收集器(Garbage Collector, GC)是Java虚拟机(JVM)中的一个关键组件,它自动地管理和释放不再使用的对象所占用的内存空间。这样可以防止内存泄漏,并简化了开发者的编程任务。

qq_45867699的博客 1586

【JVM从小白学成大佬】5.垃圾收集器及内存分配策略

前面介绍了垃圾回收算法,接下来我们介绍垃圾收集器和内存分配的策略。有没有一种牛逼的收集器像银弹一样适配所有场景?很明显,不可能有,不然我也没必要单独搞一篇文章来介绍垃圾收集器了。熟悉不同收集器的优缺点,在实际的场景中灵活运用,才是王道。 在开始介绍垃圾收集器前,我们可以剧透几点: 根据不同分代的特点,收集器可能不同。有些收集器可以同时用于新生代和老年代,而有些时候,则需要分别为新生代或老年代选用...

一起理解技术趋势,沉淀长期价值 1201

JVM之垃圾收集器与内存分配回收策略(二)

JVM之垃圾收集器与内存分配回收策略(二) 上一篇JVM垃圾收集器与内存分配策略(一),下面是jdk1.7版本的垃圾收集器之间的关系,其中连线两端的两种垃圾收集器可以进行搭配使用,下面来总结一下这些收集器的一些特点以及关系。 一、Serial收集器   1、serial收集器是一个单线程的收集器,单线程说明两点:①只会使用一个CPU或者一条...

qq_40148886的博客 170

JVM内存分配策略及垃圾收集器简介

大对象是指需要连续内存空间的对象,最典型的大对象是那种很长的字符串以及数组。

weixin_46301906的博客 1190
上一篇: JVM学习--(一)Java内存区域与内存溢出异常
下一篇: JVM学习--(三)类文件结构
jacobbbbbbbb
博客等级 码龄7年 6粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值