按照基本回收策略分:
引用计数(Reference Counting):
对象有一个引用,增加一个引用则增加一个计数,删除一个引用则减少一个计数,垃圾回收的时候,只对收集计数为0的对象。(最致命的是无法处理循环引用的问题)
- 标记-清除(Mark-Sweep):
第一阶段:从引用根节点开始标记是所有被引用的对象。第二阶段:遍历整个堆,把未标记的对象清除。(此算法需要暂停应用,还会产生内存锁片——存储的东西比较大,一个节点存储不了,多余的部分按内存碎片的形式存储)
- 复制(Copying):
把内存空间划分为两个相等的区域,每次只使用一个。垃圾回收时,遍历当前使用的区域,把正在使用中的对象复制到另一个区域中。此算法只处理正在使用的对象,复制成本小,不会出现内存碎片的问题(缺点就是需要两倍的内存空间)
- 标记-整理(Mark-Compact):
结合“标记-清除”和“复制”两个的优点。第一阶段:从根节点开始标记所有被引用的对象,第二阶段:遍历整个堆,清除未标记对象并把存活对象“压缩”到堆的其中一块,按顺序排放。
按分区对待的方式分:
- 增量收集:实时垃圾回收算法——在应用进行的同时进行垃圾回收
- 分代收集:基于对对象生命周期分析后得出的垃圾回收算法——把对象分为年青代、年老代、持久代,对不同的生命周期的对象用不同的算法进行回收。
按系统线程分:
- 串行收集:使用单线程处理垃圾回收,无需多线程交互,容易实现,效率高,适合单处理器机器,也可以用在小数据量(100M左右)情况下的多处理器机器上(需要暂停整个运行环境)
- 并行收集:使用多线程处理垃圾回收,速度快,效率高,CPU数目越多,越能体现出优势(需要暂停整个运行环境)
- 并发收集:系统在垃圾回收时会明显的暂停,堆越大时间越长
Jvm调优总结–1:概念
Jvm调优总结–2:基本垃圾回收算法
Jvm调优总结–3:垃圾回收面临的问题
Jvm调优总结–4:分代垃圾回收
Jvm调优总结–5:典型配置