浅谈java GC的几种算法 | 您所在的位置:网站首页 › gc常用算法 › 浅谈java GC的几种算法 |
最近在看这本书,对垃圾收集算法这部分内容做个笔记整理下。 java的运行时数据区如下,其实就是堆,栈,方法区,其中栈又分为虚拟机栈,本地方法栈,程序计数器,并且栈是属于线程私有,堆跟方法区是线程共享的。 几乎所有的对象都是存放在堆中的,所以java堆是垃圾收集器管理的主要区域。 可达性分析算法 通过一些GC Roots作为起点,当一些对象没有任何引用链能够到达时,则证明该节点是不可用,是需要回收的,也就是通过GC Roots无法到达的对象就是可回收对象。 如何进行垃圾回收 找到了需要回收的对象之后,接下来就是要进行垃圾回收,那么垃圾收集有哪些算法呢 1.标记-清除算法 分为两步走,首先把内存中的对象进行标记,然后把可回收的单独拿走,这样的缺点是会产生大量的内存碎片,下次如果有有大对象创建的时候就会发现内存不够,又触发一次垃圾回收,但是实际上内存是够的,只是不能连续使用,因为我们申请内存空间的时候是需要连续的一片。
标记整理算法在标记-清除算法上做了升级,解决了内存碎片的问题,也规避了复制算法只能利用一半内存区域的弊端,但它对内存变动更频繁,需要整理所有存活对象的引用地址,在效率上比复制算法要差很多。
java堆的划分 java堆分为2个区域,新生代和老年代,比例为1:2,而新生代又分为Eden区和Survivor区,Survivor 区又分为from区和to区,有些也称为s0,s1区,新生代的各区比例如下:8:1:1 老年代占据着2/3的堆内存空间,只有在 Major GC 的时候才会进行清理,每次 GC 都会触发“Stop-The-World”。内存越大,STW 的时间也越长,所以内存也不仅仅是越大就越好。由于老年代的对象存活较高,所以老年代使用标记 - 整理算法。 |
CopyRight 2018-2019 实验室设备网 版权所有 |