首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
李培培201907311922894
合肥工业大学
发布于江苏
关注
已关注
取消关注
@程序员打工人:
JVM GC 垃圾收集简介
什么是垃圾? 对于程序汇总分配的内存,当使用完成后,这部分内存就会成为垃圾,需要对其进行释放,否则,这部分内存将无法被重复利用,最终造成内存泄漏。 什么是GC? GC是一种自动的存储管理机制。当一些被占用的内存不再需要时,就应该予以释放。这种存储资源管理,称为垃圾回收。 对于java而言,是自动进行垃圾回收的。 如何发现垃圾? 既然要实现垃圾的自动回收,那么第一件事就是找到垃圾,那么如何发现垃圾呢?其实就是判断这个对象是否存活。 常见的两种方式判断: 1)引用计数法(reference count) 2)根可达性算法(root searching) 名称 实现思想 优点 缺点 引用计数法 给每个对象添加一个引用计数器,当存在一个引用时,就加1,当一个引用失效时,就减1。 判定效率高 1、无法解决相互引用、循环引用的问题。 2、存储空间开销:需要空间存储计数器。 3、时间开销:需要处理计数器的增加和减少。 根可达性算法 通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。 解决了循环引用的问题 实现较复杂,增加了计算成本。 引用计数法(reference count)的循环引用、相互引用: 没有外部引用,但是本身的计数器又不为0。 image.png 根可达性算法 由于引用计数法存在的问题,所有主流的jvm都不使用引用计数法,而是采用根可达性算法。 image.png 如上图,带有GCRoots的对象表示正在被引用,而其他的对象虽然相互间有引用,但是没有根节点,仍然会被删除。 GCRoots对象: 哪些对象可以成为GCRoots呢?jvm中主要针对堆内的内存进行垃圾回收,而在虚拟机栈、本地方法栈和方法区内的对象则不会被回收,通常选择这三个区域的对象作为GCRoots。 在jvm中主要有以下四种,在方法区存在两种: 1)虚拟机栈中引用的对象:虚拟机栈帧中的局部变量表所引用的对象。 2)本地方法栈中引用的对象:JNI (Native方法)引用的对象。 3)方法区中类静态和常量对象:静态变量和常量引用的对象。 以下图来展示在JVM内存模型(JMM)的GCRoots: image.png 在根可达性算法中,所有的引用都是强引用,下面具体分析下jvm中的四种引用。 **四种引用: 名称 定义 特点 回收 强引用 强引用就是引用了通过new 的方式创建的对象。是指创建一个对象并把这个对象赋给一个引用变量;在root搜索算法的里面,说的引用都指的是强引用关系。 GC时,永远不会被回收,导致OOM的主要原因 1、引用消失(比如方法执行完) 2、将引用变量设置为null 软引用 如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存,比如网页缓存、图片缓存等。使用软引用能防止内存泄露,增强程序的健壮性。Java中,用SoftRefrence表示弱引用。 内存不足时(自动触发GC),会被回收 内存不足时,触发自动回收 弱引用 引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示 无论内存是否充足,只要进行GC,都会被回收 只要进行GC,都会被回收 虚引用 虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。 要注意的是,虚引用必须和引用队列关联使用,设置虚引用关联的唯一目的,就是在这个对象被收集器回收的时候收到一个系统通知或者后续添加进一步的处理。Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除之前做必要的清理工作。 如同虚设,和没有引用没什么区别 任何时候都可能被回收 垃圾如何处理? 我们通过上面学到的根可达性算法可以发现垃圾的所在,那么jvm是如何进行垃圾回收的呢?通过jvm提供的垃圾收集器(GC) 。 目前有以下种类的垃圾收集器,其中虚线表示垃圾收集器可以进行组合使用: image.png 常见的垃圾收集算法 标记清除(mark sweep) :位置不连续 产生碎片 效率偏低(两遍扫描) 拷贝算法 (copying) :没有碎片,浪费空间 标记压缩(mark compact) :没有碎片,效率偏低(两遍扫描,指针需要调整) 标记清除(mark sweep) 顾名思义,标记清除算法分为两个阶段标记(mark) 和清除(sweep) 。 标记: Collector从引用根结点开始遍历,标记所有被引用的对象。一般是在对象的Header中记录为可达对象。 清除: Collector对堆内存从头到尾进行线性的遍历,如果发现某个对象在其Header中没有标记为可达对象,则将其回收。 对所有能找到根节点引用的内存空间进行标记,清除没有找到根节点的内存空间,其大概实现过程如下: image.png 缺点 : 1)STW(stop the word),回收时,应用挂起。 2)内存越大,效率越多,需要扫描的时间越长。 3)内存碎片化,会导致无法装下新申请的对象,整体内存是足够的,但并非连续的。 拷贝算法 (copying) 拷贝算法将内存空间划分为两个区间,在任意时间点,所有动态分配的对象都只能分配在其中一个区间(称为活动区间),而另外一个区间(称为空闲区间)则是空闲的。 当活动区间的内存占满时,接下来GC线程会将活动区间内的存活对象,全部复制到空闲区间,且严格按照内存地址依次排列,与此同时,GC线程将更新存活对象的内存引用地址指向新的内存地址。 其大概过程如下图所示: image.png 缺点 浪费内存,并且存活对象越多的情况下,效率越低。 标记压缩/标记整理(mark compact) 标记过程仍然和标记-清除一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理端边界以外的内存。 实现过程大概如下: image.png 缺点 效率不高,除了要标记存活对象,还要整理存活对象的引用地址,效率低于复制算法。 总结 以上三种算法都是根据根可达性算法实现的。当开始GC时,三种算法都会造成STW(stop the world)。 JVM的内存模型如何实现垃圾回收?分代模型 文章前面介绍了简单很多种垃圾收集器,不同的垃圾收集器有不同的分代模型: 1)除Epsilon、ZGC、Shenandoah之外的GC都是使用逻辑分代模型 2)G1是逻辑分代,物理不分代 3)除1)2)之外不仅逻辑分代,而且物理分代 分代模型 image.png 上图中的分代模型有些需要特别关注的点: 1)整个分代模型的组成:新生代 + 老年代 + 永久代(jdk1.7)/元空间(jdk1.8) 永久代、元空间:Class 永久代:必须指定大小限制 元空间:可以设置大小,也可以不设置,无上限(受限于物理内存) 字符串常量池: jdk1.7 - 永久代,jdk1.8 - 堆 MethodArea(方法区)逻辑概念:永久代、元数据 2)新生代: Eden + 2个suvivor区 YGC回收之后,大多数的对象会被回收,活着的进入s0 再次YGC,活着的对象eden + s0 -> s1 再次YGC,活着的对象eden + s1 -> s0 年龄足够 -> 老年代 (通常15,对象头Mark Word 的age只有4bit,最大是15 、CMS 6) suvivor区装不下 -> 老年代 3)老年代 老年代满了FGC Full GC(STW) GC Tuning 尽量减少FGC MinorGC = YGC MajorGC = FGC
点赞 5
评论 1
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
昨天 17:29
已编辑
数字马力(长沙)信息技术有限公司_后端开发
挣钱虽不多,但也弥补了校园时期的遗憾
果果牛遇见果果羊我是一名普通家庭都算不上的小牛,高考结束得知家中有一笔负债,上大学的学费都是助学贷款支付的。彼时,我在高考的时候体重已经飙升到98kg。大一一次偶然的英语课分组,我和ta分到了一组里,由于往日种种,ta和ta的舍友在班级掀起了一阵互相拍丑照制作表情包,在班级群里玩的风潮。(好怀念这种感觉,大学不似大学,班里大部分同学跟高中一样互相玩耍)而我是一个慢热小牛,在互相熟悉玩耍过程中,渐渐喜欢上ta。后来,国庆假期回来,有体测以及校园跑,我都跟着ta和ta舍友一起,就是那种为了你,我加遍了全班女孩的剧情。在11月底ta去参加在新校区举办的舞蹈比赛,只有一个观众名额,ta邀请我去看。(t...
赚钱的意义在这一刻具象化
点赞
评论
收藏
分享
2025-12-30 16:24
西南科技大学 后端工程师
双非鼠鼠也是能拒绝云智大人了
可惜太晚了,已经被马力夺舍了,这个拒的是二面,希望以后不会后悔,有一说一,腾讯的人文关怀确实强,那个面试后问卷是最舒服的
蔡徐kun:
你会后悔的,哥们
我的秋招日记
点赞
评论
收藏
分享
01-07 17:13
广州大学 前端工程师
来点多益笑话
真的没绷住,小心眼这块,这就破防了也是没绷住🤣
优秀的大熊猫在okr...:
多益:此贼,必有同谋,按律,该当连坐!
你不能接受的企业文化有哪...
点赞
评论
收藏
分享
01-26 11:35
哈尔滨工业大学 游戏后端
校招黑话 萌新扫盲必备
属于基础知识,但是需要自己收集,一次性给大家找全了 公司/组织相关(你在哪个坑位)HC(Headcount):招聘名额、人头数。造句:不好意思,我们部门今年只有 5 个 HC,已经招满了。BG(Business Group):事业群。Bg还有一个意思就是你的背景 造句:我们公司的电商 BG 和游戏 BG 今年会有一次大的合作。或BG(Background):背景,通常指候选人的“履历背景”,比如学校/学历、项目经历、实习、比赛、论文、技术栈、业务经历等,有时也指“背调”相关背景信息。BU(Business Unit):业务单元,通常在 BG 下面更细分。造句:我最近换了一个 BU 工作。Bas...
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
牛客吐槽大会 | 有槽不吐,留着过年?吐完领现金红包,痛快!
3823
2
...
J人永远闲不下来于是去提前实习
2739
3
...
拥抱AI,程序员的最后出路
1888
4
...
大厂提前实习对AI开发的新感悟
1782
5
...
真正会被取代的,是你心里面的幻觉
1703
6
...
努力挣钱的意义具象化了
1462
7
...
mentor视角下的优秀实习生
1451
8
...
去独角兽做龙头还是去大厂做凤尾
1401
9
...
马斯克最新炸裂采访,AI会带走一半工作岗位,普通人将何去何从?
1317
10
...
我身材再曼妙,也没有我的工资好笑!
1236
创作者周榜
更多
正在热议
更多
#
没关系,至少我的__很曼妙
#
3016次浏览
57人参与
#
机械人你知道哪些单休企业
#
82731次浏览
408人参与
#
赚钱的意义在这一刻具象化
#
3284次浏览
82人参与
#
AI时代的工作 VS 传统时代的工作,有哪些不同?
#
6814次浏览
154人参与
#
今年春招是金一银二嘛?
#
5383次浏览
58人参与
#
1月小结:你过的开心吗?
#
1217次浏览
41人参与
#
你的第一家实习公司是什么档次?
#
3174次浏览
54人参与
#
为什么有人零实习也能进大厂?
#
3508次浏览
74人参与
#
抛开难度不谈,你最想去哪家公司?
#
2722次浏览
71人参与
#
你的landing期是如何度过的?
#
6987次浏览
121人参与
#
一人一道大厂面试题
#
113990次浏览
1263人参与
#
当你问AI“你会取代我的工作吗”,它说_?
#
2647次浏览
83人参与
#
除了Java,最推荐学什么技术?
#
4621次浏览
121人参与
#
AI求职实录
#
2321次浏览
65人参与
#
你觉得什么岗位会被AI替代
#
36373次浏览
250人参与
#
在找工作求抱抱
#
1653417次浏览
10964人参与
#
参加完秋招的机械人,还参加春招吗?
#
103142次浏览
676人参与
#
哪些瞬间让你真切感受到了工作的乐趣
#
23160次浏览
99人参与
#
机械人春招想让哪家公司来捞你?
#
378902次浏览
3134人参与
#
银行笔面经互助
#
176427次浏览
1295人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务