首页 > 应用开发 > Java > JVM 有哪些垃圾回收算法?
该算法分为“标记”和“清除”阶段: 首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。也可以反过来先标记所有不需要被回收的对象,标记完成以后回收没有被标记的对象。
优缺点:
执行效率不稳定,适用于对象存过较多的区域,适用于老年代
会产生内存碎片
何为清除?
标记清除并不是真的置空,而是把需要清除的对象地址保存在空闲的地址列表里。下次有新对象需要加载时,判断垃圾的位置空间是否够,如果够,就存放。
将 可用内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就 将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使 每次的内存回收都是对内存区间的一半进行回收。
优点:
不会出现内存碎片问题 对于存活对象少的区域(新生代),简单高效
缺点
将可用内存减少到一半,内存浪费过大 如果存活对象过多,那么复制对象所带来的开销也会增大
标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是 让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。
优点:
消除了标记-清除算法中,内存区域分散的缺点,我们需要给新对象分配内存时,JVM只需要持有一个内存的起始地址即可。
消除了复制算法中内存减半的高额代价。
缺点:
从效率上来说,标记-整理算法要低于复制算法
移动对象的同时,如果对象被其他对象引用,则还需要调整引用的地址。
移动过程中,需要全程暂停用户应用程序。
当前虚拟机的垃圾收集都采用 分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。 一般将 java 堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。
在新生代中,每次收集都会有大量对象死去,所以可以选择”复制“算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。
Serial收集器(复制算法): 新生代单线程收集器,标记和清理都是单线程,优点是简单高效;
对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
不用多说,相信大家都有一个共识:无论什么行业,最牛逼的人肯定是站在金字塔端的人。所以,想做一个牛逼的程序员,那么就要让自己站的更高,成为技术大牛并不是一朝一夕的事情,需要时间的沉淀和技术的积累。
现在竞争这么激烈,只有通过不断学习,提高自己,才能保持竞争力。
对于一些不知道学习什么,没有一个系统路线的程序员,这里给大家提供一些学习资料
需要的小伙伴,可以一键三连, 点击这里获取免费领取方式!
内容涵盖:Java基础、JVM、高并发、多线程、分布式、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、数据库、云计算等
需要的小伙伴,可以一键三连, 点击这里获取免费领取方式!
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70000438/viewspace-2787572/ ,如需转载,请注明出处,否则将追究法律责任。