java 多线程 垃圾回收_JVM性能调优:Java垃圾回收都有哪些算法?

92d50f8deaa9f3dd0015ebb4d35e7dd1.png

按照基本回收策略分

引用计数(Reference Counting)

这个算法有很长的历史了,算是比较古老的了。该算法的原理是该对象都有一个引用,也就是说增加了一个计数,当删除一个引用就会减少一个计数。当回收垃圾时,只是收集计算等于0的对象。此算法无法处理循环引用的问题,这也是该算法最致命的缺陷。

标记-清除(Mark-Sweep)

该算法分成2个阶段执行。

第1阶段:从引用根节点开始标记所有被引用的对象;

第2阶段:对整个堆进行遍历,清除未标记的对象。

缺点:

需要暂停整个应用会产生内存碎片

4ff088ca6dc0b3ab5f1f9aba4e17bdf2.png

复制(Copying)

该算法会把内存空间划分为两个相等的区域,每一次只会使用其中的一个区域。当回收垃圾时,会遍历当前所使用的区域,会把正在使用中的对象拷贝到另一个区域中去。每一个只会处理当前正在使用中的对象,所以复制所需的成本都是比较小的,复制过去后还会进行相应的内存整理,不会有“碎片”的问题出现。

缺点:需要两倍内存空间。

9c892ff8334a6add19922391a0b01be8.png

标记-整理(Mark-Compact)

该算法是“标记-清除”和“复制”两个算法的优点结合体。

该算法的执行也是分两阶段:

第1阶段:从根节点开始标记所有被引用对象;

第2阶段:对整个堆进行遍历,对未标记的对象进行清除,把存活对象“压缩”到堆中的其中一块,按照顺序排放。

优点:

避免了“标记-清除”的碎片问题避免了“复制”算法的空间问题

0d065bf14d6220f77644ad5fb4988d05.png

按分区对待的方式分

增量收集(Incremental Collecting)

该算法是实时的垃圾回收,也就是说程序在执行的同时也在进行垃圾的回收。

分代收集(Generational Collecting)

该算法对对象的生命周期深入分析后得出的。对不同生命周期的对象使用不同的算法进行回收。从J2SE1.2开始,JVM中就是使用该垃圾回收器算法。

按系统线程分

串行收集

在处理垃圾回收工作的时候使用的是单线程执行,为什么是单线程呢?因为这里不需要多线程交互,实现起来容易,而且效率也是比较高。但是也有比较明显的局限性,就是多处理器的优势无法使用,故该收集适合在单处理器机器上。该收集器也可以用在小数据量(100M左右)情况下的多处理器机器上。

并行收集

该垃圾回收器使用多线程进行处理,故速度很快,效率很高。在理论上来讲,CPU数目越多,就越是能体现出并行收集器的优势。

并发收集

相比于前2种,前2种在进行垃圾回收工作时,整个运行环境都会暂停,而这个时候只有垃圾回收程序在运行,所以系统在进行垃圾回收的时候会有很明显的暂停,而且堆越大暂停时间而只有垃圾回收程序在运行,因此,系统在垃圾回收时会有明显的暂停,而且堆越大暂停时间就会越长。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值