你面试过程中的拦路虎 MinorGC

JAVA herman 374浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

昨天,我一个朋友给我说他在抖音上发了一个短视频,获得了 300 个赞。我说,你要么被抖音废了,要么就废了(卸载)抖音,要么你就把抖音玩到极致,成为抖音网红。

我在下载抖音的时候,玩了一个小时就把它卸载了。因为我深知,要想成功,便不要沉迷于能轻易给你短期快感的一切东西。

其实,作为程序员也是一样的。平时工作,你面向百度编程。慢慢的你会迷上搜索,无法摆脱它。不想看书,也不想进步去学习,因为所有的东西,在你眼里看起来是一搜索就能解决。其实,这只是你废了的开始。

今天我给大家讲一下,进阶中级、高级、专家级。。。的必备课,GC 中的 MinorGC。

JVM 中的堆,一般分为三大部分:新生代、老年代、永久代。新生代通常使用 MinorGC,老年代通常使用 MajorGC,永久代通常使用 Full GC。

新生代 MinorGC、老年代 MajorGC、永久代

新生代主要是用来存放新生的对象。一般占据堆的1/3空间。由于频繁创建对象,所以新生代会频繁触发 MinorGC 进行垃圾回收。新生代 MinorGC 又通常被分为:Eden 区、ServivorFrom、ServivorTo 三个区。

MinorGC 通常采用复制算法。流程是先复制,再清空,最后互换。

复制的过程很简单。首先,Eden 区满的时候回出发第一次 GC,把存活的对象拷贝到 SurvivorFrom 区,当 Eden 区再次出发 GC 的时候会扫描 Eden 区和 From 区,对这两个区域进行垃圾回收。

经过这次回收后还存活的对象,则直接复制到 To 区,同时将这些对象的年龄 +1。如果有对象年龄已经达到了老年的标准(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置),则直接复制到老年代。

发生 MinorGC 后,Eden 和 ServivorFrom 区的对象,就被复制到其他区了。

另外一个需要注意的是,如果新创建的对象占用内存很大,则直接分配到老年代。并且 SurvivorTo 区是没有进行任何回收动作的。

清空就很好理解了。因为经过 MinorGC 后,Eden 和 ServivorFrom 区的对象,就被复制到老年代或者 SurvivorTo 区。这个时候就可以对 Eden 区和 ServivorFrom 进行清空了。

清空之后,还有一个互换动作。就是把 SurvivorTo 的对象互换给 ServivorFrom 区。SurvivorTo 和 SurvivorFrom 互换,原来的 SurvivorTo 称为下一次 GC 时的 SurvivorFrom 区。部分对象会在 From 和 To
区域中来回复制,如此交换15次(JVM参数 MaxTenuringThreshold决定,默认参数是15),最终如果还是存活,就存入老年代。

这就是 MinorGC,非常的简单。大家在面试中只需要记住,ServivorTo 一开始是空的,复制算法流程是先复制,再清空,最后互换,另外一个需要注意的是,如果新创建的对象占用内存很大,则直接分配到老年代。回答到这些关键点,至少我个人会算面试者过关。

更多面试题,如:GC触发的条件?什么手机触发?GC回收对什么东西进行回收?GC回收做了什么或者说是操作了什么,怎么操作的?等等这些面试题,可以通过我的面试题小程序学习到!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 你面试过程中的拦路虎 MinorGC