您的位置:首页 > 其它

JVM虚拟机调优---------垃圾收集器算法

2017-08-04 18:45 302 查看
java虚拟机调优就是指垃圾回收机制

标记-清除法:

      算法分为标记和清除两个阶段,首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其不足进行改进而得到的,他主要有两个不足:一个是效率问题,标记和清除两个过程的效率都不高,另一个是空间问题,标记清楚后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后再程序运行过程中需要分配较大的对象时,无法找到足够的连续的内存空间而不得不提前出发另一次垃圾收集动作,

复制算法:

      为了解决效率问题,一种称为“复制”算法的收集器出现了,他将可用的内存按容量划分为大小相等的两块,每次只用其中的一块,当这一块的内存用完了,就将还存活的对象复制到另外一块上边,然后再把已使用过的内存空间一次清除掉,这样使得每次都是对整个半区域进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效,只是这种算法的代价是将内存缩小为了原来的一半,未免太高了一点。

标记整理法:

      复制收集算法在对象存活率较高的时就要进行较多的复制操作,效率会变低,更关键的是,如果不想浪费百分之五十的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以老年代一般不能直接选用这种算法。

      根据老年代的特点,有人提出了另外一种“标记-整理”算法,标记过程仍然与标记-清除算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端便捷以外的内存。

分代收集算法:

      当前商业虚拟机的垃圾收集器都采用分代收集算法,这种算法并没有什么新的思路,只是根据对象存活周期的不同将内存划分为几块,一般是把java堆分为新生代和老生代,这样就可以根据各个年代的特点采用最适当的收集算法,在新生代中,每次垃圾收集时都会有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集,而老年代中因为对象存活率高,没有额外的空间对他进行分配担保,就必须使用标记清除或者标记整理算法来进行回收。

是否可以主动通知JVM进行垃圾回收?

      由于垃圾回收器的存在,java语言本身没有给开发人员提供显式释放已分配内存的方法,也就是说,开发人员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。但是开发人员可以通过调用System.gc()方法来“通知”垃圾回收器进行,当然,JVM也并不会保证垃圾回收器马上就会运行,由于System.gc()方法的执行会停止所有的响应,去检查内存中是否有可回收的对象,这会对程序的正常运行以及性能造成极大的威胁,因此,实际编程时,不推荐频繁使用这一方法。

尽量减少临时对象的调用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: