什么是jvm垃圾?jvm垃圾回收机制有几种( 二 )


 
大体来看可以分为 这么几个步骤:
 
复制 清空 易位
 
不难看出,标记复制算法不需要标记算是提升了效率 。此外他也不会参数碎片问题 。
 
但是 。标记复制算法的缺点也是十分明显的,它需要双倍空间 。
 
问题3:垃圾回收的具体流程是怎样的?
既然说JVM虚拟机不会单独采用某种算法,而是会结合三种算法让他们协同工作,其具体的实现就是java虚拟机里的分代垃圾回收机制 。
 
上图所示,就是Java堆内存的划分 。为什么需要这么划分区域呢?那是因为我们的java对象寿命都是不同的,有的可能需要长时间使用,而有的可能用完就可以丢去 。于是我们可以根据其生命周期的不同特点,进行不同的垃圾回收策略 。
 
总的来说,新生代的垃圾回收比较频繁,老年代很久才触发一次垃圾回收 。新生代处理的都是一些朝生夕死的对象,而老年代回收的是更有价值的,会长时间存活的对象 。
举个很好理解的例子:新生代处理垃圾,就像是处理生活日用垃圾,而老年代处理的垃圾,更像是过年大扫除,家里实在太多垃圾了来一次重清理 。大扫除清理的垃圾,都是在家中存放时间较长的,往往可能曾经很受用,如今退役了先放着过年再打扫清除掉 。
 
每一次,我们创建一个对象,都会在伊甸园区占据一定内存大小,渐渐地伊甸园就满了 。当我们再要创建对象时,就会发现空间不够了 。
 
这时,就会触发一次垃圾回收,新生代触发的垃圾回收有个称呼叫做MinorGC 。
 
MinorGC触发后,伊甸园区就会对各个对象进行可达性分析,从而知道哪些对象应该作为垃圾被清理 。
 
MinorGC在这里采取的是标记复制算法,它将有用的对象存放到幸存区to,然后把伊甸园中的对象清除掉 。
 
进入幸存区的幸运儿,将会被标记上一个“幸运值”,代表他们抗住了多少次清理 。
 
最后,幸存区to和幸存区from还需要交互一下位置,这里不是指物理位置交换,而是说,它俩的定义发生了交换,下次就是左边那个为幸存区to,右边的为幸存区from了 。
 
换句话说,幸存区to始终是空的 。
 
我们再模拟多几次,加深一下印象:
 
假如又进来了不少对象,伊甸园又满了!
 
那就会触发一次MinorGC,把幸存者移步到幸存区to,其他一律清空 。
 
最后别忘了,幸存区from和幸存区to又要再交换一下”位置“ 。
【什么是jvm垃圾?jvm垃圾回收机制有几种】 

推荐阅读