大家好,又见面了,我是你们的朋友全栈君。
JVM中的垃圾回收计数是采用的一种自适应的技术(可以通过其工作方式将它“啰嗦地”称为:自适的、分代的、停止-复制、标记-清扫式垃圾回收器)
在讲Java虚拟机的自适应回收机制前,有必要说一下其他比较单纯的垃圾回收机制,然后会比较容易地理解JVM的垃圾回收:
一种简单但速度很慢的垃圾回收计数。
每个对象都含有一个引用计数器,当有引用连接至对象时,引用计数加 1 ;当引用离开作用域或者被置为null时,引用计数减 1 。垃圾回收器会在含有全部对象的列表上遍历,当发现某个对象的引用计数为 0 时,就释放其占用的空间。
引用计数常用来说明垃圾收集的工作方式,但似乎从未被应用于任何Java虚拟机的实现中。
缺点:
对于一些更快(回收性能更优秀)的垃圾回收技术,依据的思想:**对于任何“活着”的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用。 **
JVM便是在基于此种方式采用的一种自适应的垃圾回收技术。不过对于如何处理找到的存活对象,这取决于不同的Java虚拟机实现。
缺点:
缺点:
在这里讨论的Java虚拟机中,内存分配以较大的“块”为单位;当对象比较大时,会占用单独的块。
有了块的概念之后,我们可以对“复制-回收”的回收机制做一定的改进。之前的“复制-回收”要求在释放旧有对象之前,必须将所有存活对象从旧堆复制到新堆中,这会导致大量的内存复制行为;有了块之后,我们可以往废弃或闲置的块中复制对象。
那如何判断某个块是不是闲置的呢?每个块都是用对应的一个代数(generation count)记录该块是否还存活;如果该块在某处被引用,其代数便会增加。
垃圾回收器会定期地进行完整的清理动作——大型对象(占用单独的块)不会被复制,而含有小型对象的那些块便会被复制并整理。
在这过程中,JVM会进行监视,如果所有对象都很稳定,垃圾回收器的效率降低了,就切换到“标记-清扫”方式;而当“标记-清扫”下堆空间出现很多碎片时,便会切换回“停止-复制”方式。(所以知道为什么叫他“自适的、分代的、停止-复制、标记-清扫式垃圾回收器”了吧……)
Java虚拟机的回收机制介绍的差不多了,也只是比较表面的介绍,之后有机会、有能力的话再写写更加详细些的,嘻嘻。
参考文献: 《Java编程思想 Thinking in Java》 Bruce Eckel 著
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133433.html原文链接:https://javaforall.cn