Java垃圾回收机制你还不明白?一线大厂面试必问的!
作者: / 2019-10-19 / 浏览次数:

什么是自动垃圾回收?

自动垃圾回收是一种在堆内存中找出哪些凯发k8国际下载对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。

所谓使用中的对象,指的是程序中有指针指向的对象;而未使用中的对象,则没有被任何指针给指向,因此占用的内存也可以被回收掉。

在用 C 之类的编程语言时,程序员需要自己手动分配和释放内存。而 Java 不一样,它有垃圾回收器,释放内存由回收器负责。本文接下来将介绍垃圾回收机制的基本过程。

v2-21b09b7c87782492960fbb156e714db1_hd.png

标记

垃圾回收的第一步是标记。垃圾回收器此时会找出哪些内存在使用中,还有哪些不是。

v2-561732a6a667a6000b8c18be28f85dec_hd.jpg

上图中,蓝色表示已引用对象,橙色表示未引用对象。垃圾回收器要检查完所有的对象,才能知道哪些有被引用,哪些没。如果系统里所有的对象都要检查,那这一步可能会相当耗时间。

清除

这一步会删掉标记出的未引用对象。

v2-4ba8fae59eec97561c7785bd9b9f0034_hd.jpg

内存分配器会保留指向可用内存的引用,以供分配新对象。

压缩

为了提升性能,删除了未引用对象后,还可以将剩下的已引用对象放在一起,这样就能更简单快捷地分配新对象了。

v2-a43e5d139d0413602f291c83f27fe075_hd.jpg

为什么需要分代垃圾收集?

之前说过,逐一标记和压缩 Java 虚拟机里的所有对象非常低效:分配的对象越多,垃圾回收需时就越久。不过,根据统计,大部分的对象,其实用没多久就不用了。

来看个例子吧。

v2-7d52b9201acf4641bc192345d8890bf8_hd.jpg

上图可见,存活的对象随运行时间越来越少。而图中左侧的那些峰值,也表明了大部分对象其实都挺短命的。
欢迎大家关注我的公种浩,文章都会在里面更新,整理的资料也会放在里面。


JVM 分代

根据之前的规律,就可以用来提升 JVM 的效率了。方法是,把堆分成几个部分,分别是新生代、老年代,以及永生代。

v2-c819c90f3286fb1df7a9c413b13d9756_hd.jpg

新对象会被分配在新生代内存。一旦新生代内存满了,就会开始对死掉的对象,进行所谓的小型垃圾回收过程。一片新生代内存里,死掉的越多,回收过程就越快;至于那些还活着的对象,此时就会老化,并最终老到进入老年代内存。

Stop the World 事件 —— 小型垃圾回收属于一种叫 "Stop the World" 的事件。在这种事件发生时,所有的程序线程都要暂停,直到事件完成为止。

老年代用来保存长时间存活的对象。通常,设置一个阈值,当达到该年龄时,年轻代对象会被移动到老年代。最终老年代也会被回收。这个事件成为 Major GC。

Major GC 也会触发STW。通常,Major GC会慢很多,因为它涉及到所有存活对象。所以,对于响应性的应用程序,应该尽量避免Major GC。还要注意,Major GC的STW的时长受年老代垃圾回收器类型的影响。

永久代包含JVM用于描述应用程序中类和方法的元数据。永久代是由JVM在运行时根据应用程序使用的类来填充的。此外,Java SE类库和方法也存储在这里。

如果JVM发现某些类不再需要,并且其他类可能需要空间,则这些类可能会被回收。

v2-248e431338db00a49bd0a9bcfb65ad42_hd.png

世代垃圾收集过程

现在你已经理解了为什么堆被分成不同的代,现在是时候看看这些空间是如何相互作用的。后面的图片将介绍JVM中的对象分配和老化过程。

首先,将任何新对象分配给 eden 空间。两个 survivor 空间都是空的。

v2-661d8cc319c1c3a6540810e9260dfc8a_hd.jpg

当 eden 空间填满时,会触发轻微的垃圾收集。

v2-72ba43b3fa92e10bbed1e34c88d4dcc4_hd.jpg

引用的对象被移动到第一个 survivor 空间。清除 eden 空间时,将删除未引用的对象。

v2-19e490091c2f273b3e7479ff2be56683_hd.jpg

在下一次Minor GC中,Eden区也会做同样的操作。删除未被引用的对象,并将被引用的对象移动到Survivor区。然而,这里,他们被移动到了第二个Survivor区。

此外,第一个Survivor区中,在上一次Minor GC幸存的对象,会增加年龄,并被移动到S1中。待所有幸存对象都被移动到S1后,S0和Eden区都会被清空。注意,Survivor区中有了不同年龄的对象。

v2-15e6ca5d0d81bad60322d1b537f88539_hd.jpg

在下一次Minor GC中,会重复同样的操作。不过,这一次Survivor区会交换。被引用的对象移动到S0,。幸存的对象增加年龄。Eden区和S1被清空。

v2-f8208a068ebc223cf2911d94525a6fb8_hd.jpg

此幻灯片演示了 promotion。在较小的GC之后,当老化的物体达到一定的年龄阈值时,它们从年轻一代晋升到老一代。

v2-45812a3aa07044e249ac6f2c2a13f57a_hd.jpg

随着较小的GC持续发生,物体将继续被推广到老一代空间。

v2-ac37071274701b0dd7a84b56441815bd_hd.jpg

所以这几乎涵盖了年轻一代的整个过程。最终,将主要对老一代进行GC,清理并最终压缩该空间。

v2-2ed2c11e9b23c68751088a31e31d7711_hd.jpg

最后

欢迎大家一起交流,喜欢文章记得关注我点个赞哟,感谢支持!


【某某业务】网站建设、网站设计、服务器空间租售、网站维护、网站托管、网站优化、百度推广、自媒体营销、微信公众号
如有意向---联系我们
热门栏目
热门资讯

网站建设 网站托管 成功案例 新闻动态 关于我们 联系我们 服务器空间 加盟合作 网站优化

备案号: 

公司地址:江苏省南京市玄武区玄武湖 咨询QQ:9490489 手机: 电话: