JVM的内存回收机制

垃圾回收机制,简称gc。对堆与方法区的对象进行回收,因为java不像c需要编程人员手动clear,虚拟机通过垃圾回收算法,对堆与方法区的对象进行自动回收处理。

1、引用计数法(jvm没有采用,因为当两个对象相互引用的时候,它们的引用数量永远为1,这样就不会被自动回收,会造成内存泄漏。)

意思就是,对对象的引用数量进行计数,引用一次+1,减少一个引用则-1,当一段时间引用数量为0时,则认为该对象可被回收。

2、可达性分析法(jvm采用的就是该算法)

通过一系列的称为GC Roots” 的对象作为起始点,从这些节点开始向下搜索,所有所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的。作为GC Roots的对象有以下这些:虚拟机栈中引用的对象(本地变量表)、方法区中静态属性引用的对象、方法区中常亮引用的对象、本地方法栈中引用的对象(Native对象)。

3、分代回收

指将对象分为新生代,跟老年代。当对象在新生代区经过一次回收还留下的对象,则年代+1会进入到老年代,经历的回收次数越多,年代数越大。新生代因为回收量大,一般采用复制算法,而老年代的回收量比较小,采用标记-整理算法。

4、回收方法

1)复制(停止-复制 效率低,需要的空间大,优点,不会产生碎片)

采用可达性算法进行扫描,将存活的对象移动到一块空闲的区域,当存活的对象较少时,复制算法会比较高效。(该算法适用于新生代)

(2)标记-清除(标记 - 清除算法 速度较快,占用空间少,标记清除后会产生大量的碎片)

使用可达性算法先对存活的对象进行标记,标记完毕后,再扫描整个空间中未被标记的对象,并进行清除。标记-清除动作不需要移动对象,且仅对不存活的对象进行清理,在空间中存活对象较多的时候,效率较高,但由于只是清除,没有重新整理,因此会造成内存碎片。

(3)标记-整理(在标记-清除的基础上移动数据,避免产生内存碎片)

使用可达性算法先对存活的对象进行标记,然后清除未被标记的对象,但是在清除后会把活的对象向左端空闲空间移动,然后再更新其引用对象的指针,该算法避免了标记-清除的碎片问题,但由于需要进行移动,因此成本也增加了。(该算法适用于老年代)

posted @ 2019-10-08 15:46  魔力员  阅读(169)  评论(0编辑  收藏  举报

欢迎各位大佬交流指导 qq:704351018