您的位置:首页 > 其它

Jvm垃圾回收机制

2015-09-22 20:23 211 查看
Jvm垃圾回收机制(根据java编程思想进行总结)

首先打个比方C++里面的堆想象成一个院子,里面每个对象都负责管理自己的地盘,一段时间以后,对象可能被销毁,但地盘必须加以重用。

但在某些java虚拟机中堆的分配更像是传送带,没分配一个对象,他就往前移动一格。但是java的堆并不是完全像传送带那样工作,那样会导致频繁的内存页面调度进而影响到性能。其中的关键在与垃圾回收器的介入,当堆在工作的时候,将一面回收空间,一面使堆中对象紧凑的排列,这样“堆指针”就更容易移动到靠近传送带的开始处,也就尽量避免了页面的错误。通过垃圾回收器对对象重新排列,实现了一种高速的,有无限空间的可供分配的堆模型。首先了解下其他的垃圾回收机制:

一、引用计数

引用计数是一种简单但是很慢的垃圾回收技术。每个对象都含有一个引用计数器,当有引用链接至对象时,引用计数加1。当引用离开作用于或被设置为null时,引用计数减1.虽然管理引用技术的开销不大,但这项开销在整个程序的生命周期中将持续发生。垃圾回收期会在含有全部对象的列表上遍历,当发现某个对象的引用计数为0时,就释放其占用的空间(但是引用计数模式经常会在记数值变为0时立即释放对象)。这个方法存在一种缺陷,如果对象之间存在循环引用,可能会出现“对象应该被回收,但引用记数却不为0”的情况。引用记数常用来说明垃圾收集的工作方式,单似乎未被用用于任何一种java虚拟机实现中。

二、停止-复制(stop-and-copy)

将所有存活的对象复制到新堆,其他都是垃圾

缺陷:1.两个堆2.稳定状态下,还是会发生复制。

解决办法:1.堆中分配几块较大的内存,复制发生在较大的内存块。2.标记—清扫

B.基于“对于任何活的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用。”java虚拟机将采用一种自适应的垃圾回收技术。至于如何找到存活对象,取决于不同的java虚拟机实现。一种做法名叫 停止-复制(stop-and-copy),意味着先暂停程序的运行(所以它不属于后台回收模式),然后将所有存活的对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾。当对象被复制到新堆时候,它们是一个挨着一个的,所以新堆保持紧凑的排列,然后就可以想传送带那样分配空间。但是这种“复制式回收器”效率会降低,原因有两个:首先有两个堆,两个堆之间来回倒腾要维护比实际多一倍的空间。某些java虚拟机对此的处理方式是,按需从堆中分配几块较大的内存,复制发生在这些大块内存之间。第二个问题在于复制。程序进入稳定状态后,可能只会产生少量垃圾,甚至没有垃圾。尽管如此,复制式回收器仍然会将所有内存自一处复制到另一处,这很浪费。

三、标记-清扫(mark-and-sweep)

标记活的对象,全部标记完成后清理没有标记的对象,不会发生任何复制动作

C.为了避免这种情形,一些java虚拟机会进行减持:要是没有新垃圾产生,就会跳转到另一种工作模式(即“自适应”)。这种模式称为标记-清扫(mark-and-sweep)。对于一般用途而言,“标记-清扫”方式速度相当慢,但是当你知道只会产生少量垃圾甚至不会产生垃圾时,它的速度就快了。“标记-清扫”所依据的思路同样是从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象。每当它找到一个存活对象,就会给对象设一个标记,这个过程不会回收任何对象。只有全部标记工作完成的时候,清理动作才会开始。在清理过程中,没有标记的对象将被释放,不会发生任何复制动作。所以剩下的堆空间不是连续的,垃圾回收器要是希望得到连续空间的话,就得重新整理剩下的对象。“停止-复制”的意思是这种垃圾回收的动作不是在后台进行的;相反,垃圾回收动作发生的时候,程序将会被暂停。同样,“标记-清扫”工作也必须在程序暂停的情况下进行。

四、回收机制总结(终极总结)

总结:在java虚拟机中,内存的分配以较大的“块”为单位。如果对象较大,它会占用单独的块。严格来说,“停止-复制”要求在释放旧有对象之前,必须先把所有存活对象从旧堆复制到新堆,这将导致大量内存复制行为。有了块之后,垃圾回收器在回收的时候就可以往废弃的块里拷贝对象了。每个块都有相应的代数(generation count)来记录它是否还存活。通常,如果块在某处被引用,其代数会增加;垃圾回收器将对上次回收动作之后新分配的块进行整理。这对处理大量短命的临时对象很有帮助。垃圾回收器会定期进行完整的清理动作——大型对象仍然不会被复制(只是其代数会增加),内含小型对象的那些块则被复制并整理。Java虚拟机会进行监视,如果所有对象都很稳定,垃圾回收器的效率降低的话,就切换到“标记-清扫”方式;同样,java虚拟机会跟踪“标记-清扫”效果,要是在堆空间出现很多碎片,就会切换回“停止-复制”方式。这就是“自适应”技术,也可以称呼为“自适应的,分代的,停止-复制方式,标记-清扫”式垃圾回收器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: