Java Garbage Collection Basics翻译:Java的垃圾回收机制

原文:Java Garbage Collection Basics
https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
注:原文中将不该被清理的对象成为referenced object,该清理的对象称为unreferenced object。下面的翻译中我用被使用和不被使用分别表示。其实Java中应该被清理的对象应该描述为:从gc root开始搜索不到,而且经过第一次标记、清理后,仍然没有复活的对象。

什么是垃圾自动回收

垃圾自动回收是一个观察堆内存的进程,检查哪些对象还在使用,哪些不在使用了,清理不使用的对象。一个对象正在被使用(引用),说明这个对象是维持当前程序的一部分。一个不被使用(不被引用)的对象,就不会在被任何程序使用了,因此这部分内存可以释放掉。
在C语言中,程序员需要手动分配和释放内存。在Java中,释放内存可以由垃圾回收器自动完成。下面是其基本过程。

第一步:标记

垃圾回收器会标记哪一部分内存正在被使用,哪一部分不被使用。下图中,被使用的对象用蓝色标记,不被使用的对象用黄色标记。为了完成这个步骤,所有对象都需要被扫描。如果扫描所有对象,那么这是会是一个非常耗时的工作。
在这里插入图片描述

第二步:普通删除

普通删除直接移除了不被使用的对象,留下了被使用的对象和指针。内存分配器可以将新对象分配到空位置。
在这里插入图片描述
在删除不被使用的对象的基础上,可以进一步优化。将剩余的对象移动到一起(压缩),留下连续的剩余内存,这样有新的对象时,内存分配会更快更简单。
在这里插入图片描述

为什么有分代垃圾收集?

上面提到的,标记并压缩JVM中所有的对象是非常低效的。被分配的对象越多,需要被回收的对象就越多,垃圾回收消耗的时间就越长。其实根据统计,大部分的对象的生命周期都很短。
这有一个数据,Y轴代表已分配的字节,X轴代表程序运行时间。在这里插入图片描述
如你所见,随着时间推移,存活的对象越来越少。图左边的峰值也表明了,大部分对象生命周期都非常短。

JVM分代

利用上面分析的结论,可以提高JVM的效率。方法是,将堆被分成了更小的部分(分代),分别是初生代、老生代和永生代。
在这里插入图片描述
初生代是存放新对象的区域。当初生代填满,会出发minor GC。minor GC会假定大部分对象都会被回收。初生代都是无用的对象,很快就可以完成回收,存活下来的对象会被转移至老生代。
所有的minor GC都会触发Stop the World事件。此时所有线程都会暂停,直到GC完成。
老生代用来存放存活得久的对象。一般会为初声代的对象的年龄设置一个阈值,如果年龄到达这个阈值,那么就会被移到老生代。老生代也会被回收,通过major GC完成。
Major GC进行时也会触发Stop the World事件,暂停所有线程。频繁的major GC会使系统变慢,因为major GC会扫描所有存活的对象。因此major GC应该尽量少执行。另外,GC运行时线程暂停的时间也会受垃圾回收器类型的影响。
永生代包含JVM用于描述应用程序中类和方法的元数据。JVM在运行时会根据应用程序使用的类填充永久代。此外,Java SE库类和方法也会存储在这里。
如果JVM发现不再需要某些类,而另一些类需要空间时,会在full GC时回收空间。

分代垃圾收集过程

前面介绍了为什么堆被分成不同的代,现在看看这些代之间是如何协作的。后面的图片将介绍JVM中的对象分配和老化过程。
首先,所有新对象都会被分配在eden。最开始两个survivor都是空的。
在这里插入图片描述
eden填满时,会触发minor GC。
在这里插入图片描述
被使用的对象会被移动到第一个survivor,不被使用的对象会被从eden清除。
在这里插入图片描述
下一次minor GC,eden中会发生同样的操作。不被使用的对象被清理,被使用的对象移动到survivor。然而,这一次会被移动到第二个survivor(S1)。并且上一次minor GC后在survivor(S0)中的的对象的年龄会加1,并移动到S1。对象被移动到S1后,S0和eden中的对象都会被清理。现在survivor中已经有不同年龄的对象了。
在这里插入图片描述
下一次GC还是重复上述步骤,只是两个survivor的功能调换一下,被使用的对象会被移动到S0,S1和eden被清理。
在这里插入图片描述
一次minor GC后,如果有对象的年龄达到了一个阈值(比如图中是8),那它就会被从新生代移到老生代。
在这里插入图片描述
随着minor GC的不断进行,对象会被逐渐移动到老生代。
在这里插入图片描述
这基本就是新生代的所有过程。最后major GC会清理并压缩老生代。在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章